![]() |
|
|
Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
|
Опции темы | Поиск в этой теме | Опции просмотра |
#1
|
|||
|
|||
![]() Необходимо нарисовать спираль на оси координат.
Рисую 2 пересекающихся отрезка, затем из Edit беру точку, из которой веду горизонтальную линию до пересечения с одним из отрезков (пусть это будет точка Б), нужно нарисовать еще несколько линий так, что бы получилась спираль, заканчивающаяся в точке пересечения двух изначальных отрезков (точка А) и все это должно происходить каждый раз по событию EditChange Код: Код:
d :=(xp1-xp2)*(oy-oy) - (yp1-yp2)*(ox+w-ox); da:=(xp1-ox)*(oy-oy) - (yp1-oy)*(ox+w-ox); db:=(xp1-xp2)*(yp1-oy) - (yp1-yp2)*(xp1-ox); ta:=da /d; tb:=db /d; xt:= Trunc(a1+(ta*(a2-a1))); yt:= Trunc(b1+(ta*(b2-b1))); \\вычисляю координаты точки Б with img1.Canvas do begin Pen.Color:=clBlue; Pen.Width := 1; MoveTo(ox, oy); LineTo(xt, yt); end; \\ рисую линию до этой точки while ((xt=px) and (yt=py)) do \\спираль должна рисоваться до тех пор пока последняя точка Б не совпадет с точкой А begin if ((xt < px*40) AND (yt > h-py*40)) then begin a1:=xs1; a2:=xs2; b1:=ys1; b2:=ys2; c2:=xt; d2:=y0-400; end \\если точка Б слева и снизу от точки А, то рисую линию вверх до очередной точки Б. else if ((xt < px*40) AND (yt < h-py*40)) then begin a1:=xp1; a2:=xp2; b1:=yp1; b2:=yp2; c2:=x0+w; d2:=yt; end \\если слева и сверху, то рисую вправо.. else if((xt > px*40) AND (yt < h-py*40)) then begin a1:=xs1; a2:=xs2; b1:=ys1; b2:=ys2; c2:=xt; d2:=y0; end \\если справа и сверху, то рисую вниз.. else if((xt > px*40) AND (yt > h-py*40)) then begin a1:=xp1; a2:=xp2; b1:=yp1; b2:=yp2; c2:=x0; d2:=yt; end; \\если справа и снизу, то рисую влево.. d :=(a1-a2)*(d2-d1) - (b1-b2)*(c2-c1); da:=(a1-c1)*(d2-d1) - (b1-d1)*(c2-c1); db:=(a1-a2)*(b1-d1) - (b1-b2)*(a1-c1); ta:=da /d; tb:=db /d; xt:= Trunc(a1+(ta*(a2-a1))); yt:= Trunc(b1+(ta*(b2-b1))); \\подставляю числа в формулы, высчитываю точки Б with img1.Canvas do begin Pen.Color:=clBlue; Pen.Width := 1; MoveTo(ox, oy); LineTo(xt, yt); end;\\рисую линии от точки до точки c1:=xt; d1:=yt; \\в конце определяю координаты последней точки Б как начало линии в следующем цикле end; end; end. так вот, на деле рисуется только первая линия, дальше я возможно что-то напутал с циклом и условиями и ничего не рисуется.. на всякий случай прилагаю проект: 8.zip и должно быть код можно упростить, но это потом.. |