Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 08.04.2007, 13:11   #1
pahaig
 
Регистрация: 08.04.2007
Сообщений: 6
По умолчанию Помогите описать функцию

Помощь нужне не по Delphi а по математике. СРОЧНО

есть описание рисования квадрата:

MoveToEx(DC,round(x-r/2),round(y-r/2),0);
LineTo(dc,round(x+r/2),round(y-r/2));
MoveToEx(DC,round(x-r/2),round(y-r/2),0);
LineTo(dc,round(x-r/2),round(y++r/2));
MoveToEx(DC,round(x+r/2),round(y-r/2),0);
LineTo(dc,round(x+r/2),round(y+r/2));
MoveToEx(DC,round(x-r/2),round(y+r/2),0);
LineTo(dc,round(x+r/2),round(y+r/2));

x, y - координаты центра.
r - радиус описанной окружности.

т.к. делается все в Делфи то: Х возрастает с лева на право, Y возрастает с верху вниз.

Нужно:
описать этот квадрат так, чтобы при изменении одной переменной он поворачивался вокруг центра, (пример a:=a+2; поворачиваем на 2 пикселя. )
наверное надо делать через sin и cos, но у меня всегда с тригонометрией было неважно

P.S. зарание спасибо.
pahaig вне форума Ответить с цитированием
Старый 08.04.2007, 15:22   #2
Сильванович Михаил
Студент
Форумчанин
 
Регистрация: 10.11.2006
Сообщений: 196
По умолчанию

Вот:
Код:
procedure DrawRectAndCircle(DC: HDC; StartPnt,CenterPnt: TPoint; b: integer;a: real);
var
 x,y,c,d: integer;
 StartA: real;
begin
 c:=Round(Sqrt(Sqr(StartPnt.X-CenterPnt.X)+Sqr(StartPnt.Y-CenterPnt.Y)));
 d:=Round(Abs(StartPnt.X-CenterPnt.X));
if (d=0)or(c=0) then StartA:=0 else StartA:=ArcCos(d/c)-pi/4;
 x:=Round(CenterPnt.X+c*Cos(StartA+a));
 y:=Round(CenterPnt.Y+c*Sin(StartA+a));
 MoveToEx(DC,x,y,nil);
 x:=Round(x+b*Cos(StartA+a));
 y:=Round(y+b*Sin(StartA+a));
 LineTo(DC,x,y);
 MoveToEx(DC,x,y,nil);
 x:=Round(x+b*Cos(pi/2+StartA+a));
 y:=Round(y+b*Sin(pi/2+StartA+a));
 LineTo(DC,x,y);
 MoveToEx(DC,x,y,nil);
 x:=Round(x+b*Cos(pi+StartA+a));
 y:=Round(y+b*Sin(pi+StartA+a));
 LineTo(DC,x,y);
 MoveToEx(DC,x,y,nil);
 x:=Round(x+b*Cos(3*pi/2+StartA+a));
 y:=Round(y+b*Sin(3*pi/2+StartA+a));
 LineTo(dc,x,y);
end;
З.Ы. StartPoint - координата левого верхнего угла квадрата, CenterPnt - координата центра вращения, b - сторона квадрата, a - угол поворота
Visita Interiorem Terrae Rectificando Operae Lapidem...

Последний раз редактировалось Сильванович Михаил; 08.04.2007 в 18:25.
Сильванович Михаил вне форума Ответить с цитированием
Старый 09.04.2007, 22:28   #3
pahaig
 
Регистрация: 08.04.2007
Сообщений: 6
По умолчанию

спасибо, вот только я переделал под свою прграмму, у меня компелируется а при прорисовке выдает ошибку, посмотрите може что не так? другие фигуры ресуются, у меня были проблемы с ArcCos, но потом подключил модуль Math, и прога стала компилироватся.

Вот часть кода (основное выделенно жирным)


Код HTML:
[SIZE=1]uses[/SIZE]
[SIZE=1]Windows,[/SIZE]
[SIZE=1]Messages,[/SIZE]
[SIZE=1]Math;[/SIZE]
[SIZE=1]const max=10;[/SIZE]
[SIZE=1]type[/SIZE]
[SIZE=1]TFigur = record[/SIZE]
[SIZE=1]x,y,r,tip,del,col,a,t,c1,c2,c3,b,d,h,x1,y1: integer;[/SIZE]
 
[SIZE=1]end;[/SIZE]
[SIZE=1]var x,y,r,tip,i,j,c,del,col,a,t,c1,c2,c3,b,d,h,x1,y1: integer;[/SIZE]
[SIZE=1]F: array[1..max] of TFigur;[/SIZE]
[SIZE=1]n1,n2,n3,n4,n5,n6,n7,n8,n9,n0,StartU,u: real;[/SIZE]
[SIZE=1]function WindowProc (HWindow: HWnd; Message: UINT;[/SIZE]
[SIZE=1]WParam, LParam: Longint): Longint; stdcall;[/SIZE]
[SIZE=1]const Wind1 = 'okno';[/SIZE]
[SIZE=1]Windnam = 'okno1';[/SIZE]
[SIZE=1]var res: integer;[/SIZE]
[SIZE=1]DC: HDC;[/SIZE]
[SIZE=1]ps: TPaintstruct;[/SIZE]
[SIZE=1]rect: Trect;[/SIZE]
[SIZE=1]pen, pen_tmp: HPEN;[/SIZE]
[SIZE=1]procedure Drow(F:TFigur; DC:HDC);[/SIZE]
[SIZE=1]begin[/SIZE]
[SIZE=1]case F.col of[/SIZE]
[SIZE=1]1: begin pen:=CreatePen(PS_SOLID, 2, RGB($b1, $b1, $b1)); // цвет неактивной фигуры[/SIZE]
[SIZE=1]pen_tmp:= SelectObject(DC, pen);[/SIZE]
[SIZE=1]end;[/SIZE]
[SIZE=1]2: begin pen:=CreatePen(PS_SOLID, 5, RGB($00, $FF, $00)); // цвет активной не перекрашенной фигуры[/SIZE]
[SIZE=1]pen_tmp:= SelectObject(DC, pen);[/SIZE]
[SIZE=1]end;[/SIZE]
[SIZE=1]3: begin pen:=CreatePen(PS_SOLID, 5, RGB($FF, $00, $00)); //красный цвет[/SIZE]
[SIZE=1]pen_tmp:= SelectObject(DC, pen);[/SIZE]
[SIZE=1]end;[/SIZE]
[SIZE=1]4: begin pen:=CreatePen(PS_SOLID, 5, RGB($99, $1f, $95)); // сиреневый цвет[/SIZE]
[SIZE=1]pen_tmp:= SelectObject(DC, pen);[/SIZE]
[SIZE=1]end;[/SIZE]
[SIZE=1]5: begin pen:=CreatePen(PS_SOLID, 5, RGB($e5, $d4, $15)); // желтый цвет[/SIZE]
[SIZE=1]pen_tmp:= SelectObject(DC, pen);[/SIZE]
[SIZE=1]end;[/SIZE]
[SIZE=1]6: begin pen:=CreatePen(PS_SOLID, 2, RGB($FF, $00, $00)); //красный цвет неактивной фигуры[/SIZE]
[SIZE=1]pen_tmp:= SelectObject(DC, pen);[/SIZE]
[SIZE=1]end;[/SIZE]
[SIZE=1]7: begin pen:=CreatePen(PS_SOLID, 2, RGB($99, $1f, $95)); // сиреневый цвет неактивной фигуры[/SIZE]
[SIZE=1]pen_tmp:= SelectObject(DC, pen);[/SIZE]
[SIZE=1]end;[/SIZE]
[SIZE=1]8: begin pen:=CreatePen(PS_SOLID, 2, RGB($e5, $d4, $15)); // желтый цвет неактивной фигуры[/SIZE]
[SIZE=1]pen_tmp:= SelectObject(DC, pen);[/SIZE]
[SIZE=1]end;[/SIZE]
[SIZE=1]end;[/SIZE]
[SIZE=1]case F.tip of[/SIZE]
[SIZE=1]1: begin[/SIZE]
[SIZE=1]MoveToEx(DC, round(F.x), round(F.y+F.r), nil);[/SIZE]
[SIZE=1]LineTo(DC, round(F.x+F.r), round(F.y));[/SIZE]
[SIZE=1]LineTo(DC, round(F.x), round(F.y-F.r));[/SIZE]
[SIZE=1]LineTo(DC, round(F.x-F.r), round(F.y));[/SIZE]
[SIZE=1]LineTo(DC, round(F.x), round(F.y+F.r));[/SIZE]
[SIZE=1]end;[/SIZE]
[SIZE=1]2: begin[/SIZE]
[SIZE=1]MoveToEx(DC,round(F.x-F.r/2),round(F.y-F.r/2),0);[/SIZE]
[SIZE=1]LineTo(dc,round(F.x+F.r/2),round(F.y-F.r/2));[/SIZE]
[SIZE=1]MoveToEx(DC,round(F.x-F.r/2),round(F.y-F.r/2),0);[/SIZE]
[SIZE=1]LineTo(dc,round(F.x-F.r/2),round(F.y+F.r/2));[/SIZE]
[SIZE=1]MoveToEx(DC,round(F.x+F.r/2),round(F.y-F.r/2),0);[/SIZE]
[SIZE=1]LineTo(dc,round(F.x+F.r/2),round(F.y+F.r/2));[/SIZE]
[SIZE=1]MoveToEx(DC,round(F.x-F.r/2),round(F.y+F.r/2),0);[/SIZE]
[SIZE=1]LineTo(dc,round(F.x+F.r/2),round(F.y+F.r/2));[/SIZE]
[SIZE=1]end;[/SIZE]
3: [B]begin[/B]
[B]h:=round(Sqrt(Sqr((F.x-F.r/2)-(F.x))+((F.y-F.r/2)-(F.y))));[/B]
[B]d:=round(Abs((F.x-F.r/2)-(F.x)));[/B]
[B]if (d=0)or(h=0) then StartU:=0 else StartU:=ArcCos(d/c)-pi/4;[/B]
[B]F.x1:=Round(F.x+h*Cos(StartU+u));[/B]
[B]F.y1:=Round(F.y+h*Sin(StartU+u));[/B]
[B]MoveToEx(DC,F.x,F.y,nil);[/B]
[B]F.x1:=round(F.x1+b*Cos(StartU+u));[/B]
[B]F.y1:=round(F.y1+b*Sin(StartU+u));[/B]
[B]LineTo(DC,F.x1,F.y1);[/B]
[B]MoveToEx(DC,F.x1,F.y1,nil);[/B]
[B]F.x1:=Round(F.x1+b*Cos(pi/2+StartU+u));[/B]
[B]F.y1:=Round(F.y1+b*Sin(pi/2+StartU+u));[/B]
[B]LineTo(DC,F.x1,F.y1);[/B]
[B]MoveToEx(DC,F.x1,F.y1,nil);[/B]
[B]F.x1:=Round(F.x1+b*Cos(pi+StartU+u));[/B]
[B]F.y1:=Round(F.y1+b*Sin(pi+StartU+u));[/B]
[B]LineTo(DC,F.x1,F.y1);[/B]
[B]MoveToEx(DC,F.x1,F.y1,nil);[/B]
[B]F.x1:=Round(F.x1+b*Cos(3*pi/2+StartU+u));[/B]
[B]F.y1:=Round(F.y1+b*Sin(3*pi/2+StartU+u));[/B]
[B]LineTo(dc,F.x1,F.y1);[/B]
[B]SelectObject(DC,pen_tmp);[/B]
[B]EndPaint(DC, ps)[/B]
end;
end;
end;
begin
res:= 0;
case Message of
WM_PAINT: begin
DC:=BeginPaint(HWindow,ps);
for i:=1 to 10 do
begin
Drow(F[i], DC);
end;
SelectObject(DC,pen_tmp);
EndPaint(DC, ps);
end;
pahaig вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Помогите написать функцию Черничный Общие вопросы Delphi 4 13.08.2008 07:02
где описать переменную Manitu Помощь студентам 2 14.05.2008 18:23
помогите пожалуйста описать две функции номак Паскаль, Turbo Pascal, PascalABC.NET 5 08.01.2008 21:31
Как в XML Schema правильно описать дочерние элементы Stilet HTML и CSS 4 21.11.2007 15:04