Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > [ "Начинающим" ]
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 17.02.2014, 01:28
nano_bot nano_bot вне форума
Новичок
 
Регистрация: 05.05.2013
Сообщения: 62
Версия Delphi: Delphi 7
Репутация: 10
Восклицание Как нарисовать стрелку с наконечником не на конце?

Здравствуйте! Рисую стрелку этим кодом
Код:
procedure arrow(nachalo,konec:tpoint);
var
   B, deltaX, deltaY: Extended;
begin
   Image1.Canvas.PenPos := nachalo;// nachalo - координаты начала стрелки
   Image1.Canvas.LineTo(konec.x, konec.y);
   if nachalo.x <> konec.x then //  проверка деление на ноль
   begin
     if (nachalo.X > konec.X) then
       B := DegToRad(135) - ArcTan((nachalo.Y - konec.Y) / (nachalo.X - konec.X))
     else
       B := DegToRad(45) - ArcTan((nachalo.Y - konec.Y) / (nachalo.X - konec.X)); // наконечник стрелки под углом 45
     deltaX := 10 * Cos(B); // длина стрелки
     deltaY := 10 * Sin(B);

     if (nachalo.X > konec.X) then
     begin
       Image1.Canvas.PenPos := Point(konec.X, konec.Y);
       Image1.Canvas.LineTo(konec.X - Trunc(deltaX), konec.Y + Trunc(deltaY));
       Image1.Canvas.PenPos := Point(konec.X, konec.Y);
       Image1.Canvas.LineTo(konec.X + Trunc(deltaY), konec.Y + Trunc(deltaX));
     end
     else
     begin
       Image1.Canvas.moveto(konec.X, konec.Y);
       Image1.Canvas.LineTo(konec.X - Trunc(deltaX), konec.Y + Trunc(deltaY));
       Image1.Canvas.PenPos := Point(konec.X, konec.Y);
       Image1.Canvas.LineTo(konec.X - Trunc(deltaY), konec.Y - Trunc(deltaX));
     end;
   end;
все отлично рисуется, но мне требуется чтобы наконечник стрелки был не в коцне линии, а на 20 пикселей раньше. Подправлял и там и сям, не помогло. Подскажите, как это сделать? Что подправить в коде?
Изображения
Тип файла: jpg стрелка.jpg (4.2 Кбайт, 18 просмотров)
Ответить с цитированием
  #2  
Старый 17.02.2014, 03:39
Аватар для Alegun
Alegun Alegun вне форума
LMD-DML
 
Регистрация: 12.07.2009
Адрес: Богородское
Сообщения: 3,025
Версия Delphi: D7E
Репутация: 1834
По умолчанию

Вторая строчка в вашем коде
Код:
...
 Image1.Canvas.LineTo(konec.x + 20, konec.y + 20);
...

З.Ы. Ну и конечно, дописать в начало
Код:
dec(konec.x, 20);
dec(konec.y, 20);

З.Ы.З.Ы. Да, что-то это не работает правильно...

З.Ы.З.Ы.P.S. Нашлось по теме только такое

Последний раз редактировалось Alegun, 17.02.2014 в 08:39.
Ответить с цитированием
Этот пользователь сказал Спасибо Alegun за это полезное сообщение:
nano_bot (17.02.2014)
  #3  
Старый 17.02.2014, 16:10
nano_bot nano_bot вне форума
Новичок
 
Регистрация: 05.05.2013
Сообщения: 62
Версия Delphi: Delphi 7
Репутация: 10
По умолчанию

спасибо! Помогло!
Ответить с цитированием
  #4  
Старый 18.02.2014, 00:21
Аватар для Alegun
Alegun Alegun вне форума
LMD-DML
 
Регистрация: 12.07.2009
Адрес: Богородское
Сообщения: 3,025
Версия Delphi: D7E
Репутация: 1834
По умолчанию

Да нет, проблема осталась, такое действует лишь на прямых углах, потому как положение наконечника стрелки расчитывается от центра окружности чем является поинт konec и из-за этого на других углах происходит рассогласование в расположении наконечника. Вроде надо дорисовывать продолжение прямой линии стрелки с расчётом sin/cos относительно её начала, но у меня не получилось, погрешность вычислений плюс Pi / 2 заметно смещает добавляемый отрезок от нового центра окружности. Так и не вкурил, с математикой совсем видно напряги
Ответить с цитированием
Этот пользователь сказал Спасибо Alegun за это полезное сообщение:
nano_bot (19.02.2014)
  #5  
Старый 19.02.2014, 01:01
nano_bot nano_bot вне форума
Новичок
 
Регистрация: 05.05.2013
Сообщения: 62
Версия Delphi: Delphi 7
Репутация: 10
По умолчанию

не не, я про помогло имел ввиду вот это:
Цитата:
Сообщение от Alegun

З.Ы.З.Ы.P.S. Нашлось по теме только такое
отличный модуль, там и смещение есть как мне надо да и остальные функции пригодились!
Ответить с цитированием
Ответ


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 09:14.


 

Сайт

Форум

FAQ

RSS лента

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2023

ВКонтакте   Facebook   Twitter