Помогите пожалуйста с программой для курсовика

За вознаграждение или нахаляву (если повезёт)

Модераторы: Хыиуду, MOTOCoder, Medved, dr.Jekill

Ответить
servok
Сообщения: 3
Зарегистрирован: 17 апр 2007, 22:38

Ребят помогите пожалуйста с программой для курсовика, а то я ника не могу сделать сам.
Вот условие:
Заданы уравнения трех кривых на плоскости. Одно из уравнений содержит переменный коэффициент k. Кривые, пересекаясь, ограничивают замкнутую область D, размеры которой зависят от значения коэффициента k.
Заданы k нач. , k кон. и набор из n произвольных значений коэффициента, n не более 10 (k нач. меньше k кон. )

На той же плоскости заданы декартовы координаты точек, образующих множество М (координаты задаются произвольно, n не больше 20).
Для каждого из заданных значений k сформировать P - подмножество M, содержащее точки, которые находятся внутри замкнутой области D.

Уравнения линий:
y = x^2 - x + 1
y = k * cos(x + 0,25)
y = sqrt(1,5 * x)

k нач - 1,0
k кон - 2,2

Заранее спасибо.
Blood_Magic
Сообщения: 273
Зарегистрирован: 30 июн 2005, 14:53

очнь сложно, боюсь, что участникам нашего форума это не под силу
- Чем юзер похож на обезьяну?
- Он жмет на все, что жмется, дергает все, что дергается и крутит все, что крутится.
- Чем юзер отличается от обезьяны?
- У обезьяны хватает ума не воспроизводить ту последовательность, которая приводит к краху системы.
servok
Сообщения: 3
Зарегистрирован: 17 апр 2007, 22:38

Блин ну хоть алгоритм бы кто-нибудь смог составить.
Blood_Magic
Сообщения: 273
Зарегистрирован: 30 июн 2005, 14:53

servok писал(а):Блин ну хоть алгоритм бы кто-нибудь смог составить.

что такое алгоритм?
- Чем юзер похож на обезьяну?
- Он жмет на все, что жмется, дергает все, что дергается и крутит все, что крутится.
- Чем юзер отличается от обезьяны?
- У обезьяны хватает ума не воспроизводить ту последовательность, которая приводит к краху системы.
Аватара пользователя
SergeyS
Сообщения: 196
Зарегистрирован: 21 ноя 2006, 17:12
Откуда: Хакасия, Абакан
Контактная информация:

Для начала неплохо бы нарисовать данную картинку:
Изображение

Из заданных функций две являются неизменными
y = x^2 - x + 1 // пусть будет f1(x)
y = sqrt(1,5 * x) // f2(x)

а функция
y = k * cos(x + 0,25) // f3(x)
меняется, но меняется не шаг синусоиды, а только её амплитуда.
В зависимости от значения k мы будем иметь следующие ситуации:
1. если k очень мало (или = 0) то у нас вообще не будет пересечений кривых (уменьшается высота синей кривой)
2. если k очень велико, то у нас будет только одно пересечение (увеличивается высота синей кривой)
3. а если как изображено на рисунке, то у нас будет аж две области

Для определения описанной выше ситуации нужно найти точки пересечения двух функций f1(x) и f2(x). Их будет две. Пусть это будут точки (x1, y1), (x2, y2) (мне вычислять их лениво :) и жаль на рисунке не отметил, но пусть будет y1 < y2)
Если y1 < f3(x1) and y2 > f3(x2) то у нас вариант 3
Если y1 < f3(x1) and y2 < f3(x2) то у нас вариант 2
Если y1 > f3(x1) то у нас вариант 1

Как только ты определишь текущий вариант, то перебирай каждую точку из множества М и определяй её положение относительно каждой кривой в зависимости от текущего варианта. Как это сделать подумай сам - - это ж как никак твоя курсовая, да и помочь думающему человеку всегда приятней чем какому-нибудь халявщику.
Вложения
Graph.jpg
Graph.jpg (9.42 КБ) 87 просмотров
Аватара пользователя
somewhere
Сообщения: 1858
Зарегистрирован: 31 авг 2006, 17:14
Откуда: 71 RUS
Контактная информация:

&quot писал(а):очнь сложно, боюсь, что участникам нашего форума это не под силу
Не стоит так думать обо всех, и не такие задачи решали
Вот код:
[syntax="PASCAL"]
uses crt, graph;

type
TPoint = record x,y : Real; end;

var
Pts : array [1..20] of TPoint;
drv, mode : Integer;
RangeX, RangeY : Real;
ch, ch1 : Char;
ks : Array[1..10] of Real;
curK : Integer;

procedure InitK;
var x : Integer;
begin
for x := 1 to 10 do ks[x] := Random * (2.2 - 1) + 1;
end;

procedure InitPoints;
var x : Integer;
begin
for x := 1 to 20 do
begin
pts[x].x := RangeX*random/2;
pts[x].y := RangeY*random/2;
end;
end;

Function gFunc1(x:Real):Real;
begin
gFunc1 := x*x - x + 1;
end;

Function gFunc2(x, k:Real):Real;
begin
gFunc2 := k * cos(x + 0.25);
end;

Function gFunc3(x:Real):Real;
begin
if x>=0 then gFunc3 := sqrt(1.5*x)
else gFunc3 := 0;
end;

procedure PointToScreen(X,Y:Real;color : Integer);
begin
PutPixel(trunc((X+RangeX/2)/RangeX*GetMaxX), trunc((RangeY/2-Y)/RangeY*GetMaxY), color);
end;

procedure Solve;
var x : Integer;
a, b : Integer;
begin
For x := 1 to 20 do
begin
if (gFunc1(pts[x].X) < pts[x].Y)
and (gFunc2(pts[x].X, ks[CurK]) < pts[x].Y)
and (gFunc3(pts[x].X) > pts[x].Y)
and (pts[x].X >= 0) then
begin
a := trunc((pts[x].X+RangeX/2)/RangeX*GetMaxX);
b := trunc((RangeY/2-pts[x].Y)/RangeY*GetMaxY);
SetColor(13);
Circle(a, b, 4);
end;
end;
end;

procedure Repaint;
var x : Integer;
r,a : Real;
begin
ClearViewPort;
SetColor(11);
Moveto(0, GetMaxY div 2);
LineTo(GetMaxX, GetMaxY div 2);
MoveTo(GetMaxX div 2, 0);
LineTo(GetMaxX div 2, GetMaxY);
for x := 0 to GetMaxx-1 do
begin
a := X/GetMaxX*RangeX - RangeX/2;
PutPixel(x, trunc((RangeY/2 - gFunc1(a))/RangeY * GetMaxY), 15);
PutPixel(x, trunc((RangeY/2 - gFunc2(a, ks[CurK]))/RangeY * GetMaxY), 15);
PutPixel(x, trunc((RangeY/2 - gFunc3(a))/RangeY * GetMaxY), 15);
end;
For x := 1 to 20 do
PointToScreen(pts[x].X, pts[x].Y, 14);
Solve;
end;

begin
Randomize;
CurK := 1;
RangeX := 6;
RangeY := 4;
drv := detect;
mode := 2;
InitGraph(drv, mode, '');
InitPoints;
InitK;
Repaint;
repeat
ch := UpCase(Readkey);
ch1:= #0;
if ch=#0 then ch1 := Readkey;
if ch1='H' then
begin
RangeX := RangeX/1.1;
RangeY := RangeY/1.1;
Repaint;
end;
if ch1='P' then
begin
RangeX := RangeX*1.1;
RangeY := RangeY*1.1;
Repaint;
end;
if ch ='A' then
begin
if CurK < 10 then inc(CurK);
Repaint;
end;
if ch ='Z' then
begin
if CurK > 1 then dec(CurK);
Repaint;
end;
if ch ='Q' then
begin
InitPoints;
Repaint;
end;
until (ch=#27) or (ch=#13);
CloseGraph;
end.
[/syntax]
A,Z - перебор значений К.
Стелка вврех/вниз - менять масштаб.
Q - задает новые значения точек множества М
Esc или Enter - выход.
Точки подмножества Р обводятся фиолетовыми кружками.
Замкнутых областей кривых образуется больше одной при одном и том же К. Так что выбирайте сами, какая область нужна.
В процедуре Solve поменяв знаки >, < можно задать любую из 8-ми областей пересечения. Комментарии по вопросам.
It's a long way to the top if you wanna rock'n'roll
Аватара пользователя
Игорь Акопян
Сообщения: 1440
Зарегистрирован: 13 окт 2004, 17:11
Откуда: СПБ
Контактная информация:

Blood_Magic лень отвечать - не отвечай (удалил)

servok, тему перенёс в профильный раздел
Изображение
servok
Сообщения: 3
Зарегистрирован: 17 апр 2007, 22:38

Спасибо всем за помощь, Если нужна будет помощь по PHP JS или MySQL, то обращайтесь ;)
Ответить