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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 13.10.2011, 16:31   #1
Drozd-A
Пользователь
 
Регистрация: 01.06.2011
Сообщений: 12
По умолчанию Путаница с While и If

Необходимо нарисовать спираль на оси координат.
Рисую 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.
так вот, на деле рисуется только первая линия, дальше я возможно что-то напутал с циклом и условиями и ничего не рисуется..

на всякий случай прилагаю проект:
Новая папка (7).zip
и должно быть код можно упростить, но это потом..

Последний раз редактировалось Drozd-A; 13.10.2011 в 16:34.
Drozd-A вне форума Ответить с цитированием
Старый 14.10.2011, 16:00   #2
Drozd-A
Пользователь
 
Регистрация: 01.06.2011
Сообщений: 12
По умолчанию

!!! .
Drozd-A вне форума Ответить с цитированием
Старый 14.10.2011, 17:00   #3
*PB*
Форумчанин
 
Регистрация: 11.08.2009
Сообщений: 558
По умолчанию

Используйте отладчик.
Выполняя программу в пошаговом режиме, посмотрите в какой момент, программа начинает выполнятся не так, как было задумано. Так найдете проблему в коде.
*PB* вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Путаница с типами для больших строк WennY Общие вопросы Delphi 5 02.09.2011 06:27
Путаница в формах в Delphi TaYgA Помощь студентам 2 26.10.2009 19:51