Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Рисуем стрелку. 
:(
    Опции темы
Elfet
Дата 4.12.2006, 16:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Белый и Пушистый
****


Профиль
Группа: Awaiting Authorisation
Сообщений: 3776
Регистрация: 2.4.2003

Репутация: нет
Всего: 16



Есть координаты двух точек. На одном конце этого отрезка нужно нарисовать стрелку по заданной длине и ширине (получить координаты двух точек)  smile 
user posted image



--------------------
PM MAIL WWW Skype   Вверх
Sartorius
Дата 4.12.2006, 16:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1568
Регистрация: 18.7.2006
Где: Ivory tower

Репутация: 1
Всего: 37



 Если есть возможность использовать GDI+, то там такое уже есть. Если нет - то просто возьми точку на отрезке на нужном расстоянии от конца и поверни относительно него на нужный угол по часовой и в обратном направлении 
Вот на всякий случай оператор поворота на угол А
!cosA    -sinA!     ! x !
!sinA     cosA!  * ! y !

ЗЫ а вообще тема обсуждалась пару недель назад... тока найти чего то не могу

Это сообщение отредактировал(а) Sartorius - 4.12.2006, 16:18
PM MAIL ICQ   Вверх
Elfet
Дата 4.12.2006, 17:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Белый и Пушистый
****


Профиль
Группа: Awaiting Authorisation
Сообщений: 3776
Регистрация: 2.4.2003

Репутация: нет
Всего: 16



 smile как делать я тоже представляю, но вот не получается ;)


--------------------
PM MAIL WWW Skype   Вверх
SoWa
Дата 4.12.2006, 20:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Харекришна
****


Профиль
Группа: Комодератор
Сообщений: 2422
Регистрация: 18.10.2004

Репутация: 6
Всего: 74



Код

procedure DrawArrow(x0,y0,x1,y1: integer; l,ygol: real);
var
c: TCanvas;
alpha, beta: real;
xk1,xk2,yk1,yk2: integer;
begin
c:=Form1.Image1.Canvas;

c.Pen.Color:=clblack;
c.MoveTo(x0,y0);
c.LineTo(x1,y1);


if (y1-y0)=0 then
begin
alpha:=0;
end else
alpha:=arctan(abs(x1-x0)/abs(y1-y0));

alpha:=90- RadToDeg(alpha);



{V}if (x1<x0)and(y1<y0) then
begin
beta:=degtoRad(alpha+ygol);

xk1:=trunc(x1-(l*cos(beta-180)));
yk1:=trunc(y1-(l*sin(beta-180)));
c.MoveTo(x1,y1);
c.LineTo(xk1, yk1);

beta:=degtoRad(alpha-ygol);

xk2:=trunc(x1-(l*cos(beta-90)));
yk2:=trunc(y1-(l*sin(beta-90)));
c.MoveTo(x1,y1);
c.LineTo(xk2, yk2);
end;

{V} if (x1> x0)and(y1>y0) then
begin
beta:=degtoRad(alpha+ygol);

xk1:=trunc(x1-(l*cos(beta)));
yk1:=trunc(y1-(l*sin(beta)));
c.MoveTo(x1,y1);
c.LineTo(xk1, yk1);

beta:=degtoRad(alpha-ygol);

xk2:=trunc(x1-(l*cos(beta)));
yk2:=trunc(y1-(l*sin(beta)));
c.MoveTo(x1,y1);
c.LineTo(xk2, yk2);
end;

{V}if (x1< x0)and(y1>y0) then
begin
beta:=degtoRad(alpha+ygol);

xk1:=trunc(x1+(l*cos(beta)));
yk1:=trunc(y1-(l*sin(beta)));
c.MoveTo(x1,y1);
c.LineTo(xk1, yk1);

beta:=degtoRad(alpha-ygol);

xk2:=trunc(x1+abs(l*cos(beta)));
yk2:=trunc(y1+abs(l*sin(beta)));
c.MoveTo(x1,y1);
c.LineTo(xk2, yk2);
end;

if (x1>x0)and(y1<y0) then
begin
beta:=degtoRad(180- (180-(alpha+ygol)));

xk1:=trunc(x1-(l*cos(beta)));
yk1:=trunc(y1+(l*sin(beta)));
c.MoveTo(x1,y1);
c.LineTo(xk1, yk1);

beta:=degtoRad(180-(ygol+(180-alpha)));

xk2:=trunc(x1-(l*cos(beta)));
yk2:=trunc(y1+(l*sin(beta)));
c.MoveTo(x1,y1);
c.LineTo(xk2, yk2);
end;

end;


Извини, на Дельфи.
l- длинна концов стрелки.
С остальным, думаю, проблемм не будет?

СУВ, SoWa.


--------------------
Всем добра smile
PM MAIL ICQ   Вверх
Elfet
Дата 4.12.2006, 20:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Белый и Пушистый
****


Профиль
Группа: Awaiting Authorisation
Сообщений: 3776
Регистрация: 2.4.2003

Репутация: нет
Всего: 16



Немножко тяжело разобраться уже в готовом коде. smile SoWa каким способом ты делал? (если есть Mathematica то там удобно формулы писать и объяснять)


--------------------
PM MAIL WWW Skype   Вверх
SoWa
Дата 5.12.2006, 05:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Харекришна
****


Профиль
Группа: Комодератор
Сообщений: 2422
Регистрация: 18.10.2004

Репутация: 6
Всего: 74



Математикой не умею.
Значит так.
Берем координаты конца стрелки и по синусам/косинусам определяем координаты вершинок отрезков.
Рассматриваются 4 случая, когда вершина стрелки в каждой из четвертей, там значения синусов и косинусов по знакам разные. Все делалось сперва на обрывке бумажки, а потом уж в компе smile 
Удачи!


--------------------
Всем добра smile
PM MAIL ICQ   Вверх
Elfet
Дата 5.12.2006, 18:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Белый и Пушистый
****


Профиль
Группа: Awaiting Authorisation
Сообщений: 3776
Регистрация: 2.4.2003

Репутация: нет
Всего: 16



Можешь выложить бумажку? smile А то так неясно. Или нарисовать где?  smile 


--------------------
PM MAIL WWW Skype   Вверх
SoWa
Дата 5.12.2006, 18:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Харекришна
****


Профиль
Группа: Комодератор
Сообщений: 2422
Регистрация: 18.10.2004

Репутация: 6
Всего: 74



Ууу. Это я два года назад делал smile
Все просто. Берешь точку. По формуле l*sin(x) и l*cos(x) получаешь изменения координат для концов стрелочек. Прибавляешь их с учетом знака(зависит от четверти) к координатам конца отрезка.

А тебе суть понять важно или программу?
Если алгоритм, то завтра почеркаюсь и выложу.


--------------------
Всем добра smile
PM MAIL ICQ   Вверх
Elfet
Дата 5.12.2006, 22:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Белый и Пушистый
****


Профиль
Группа: Awaiting Authorisation
Сообщений: 3776
Регистрация: 2.4.2003

Репутация: нет
Всего: 16



Суть я тоже понимаю smile Видимо мне алгоритм нужен, раз так форум называется ;) Вот как решается в C#: http://forum.vingrad.ru/topic-123478/kw-%F...2583/index.html


--------------------
PM MAIL WWW Skype   Вверх
maxim1000
Дата 6.12.2006, 00:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник
Сообщений: 3334
Регистрация: 11.1.2003
Где: Киев

Репутация: 33
Всего: 110



Цитата(Sartorius @  4.12.2006,  15:16 Найти цитируемый пост)
просто возьми точку на отрезке на нужном расстоянии от конца и поверни относительно него на нужный угол по часовой и в обратном направлении 
Вот на всякий случай оператор поворота на угол А
!cosA    -sinA!     ! x !
!sinA     cosA!  * ! y !


Цитата(Elfet @  4.12.2006,  16:07 Найти цитируемый пост)
как делать я тоже представляю, но вот не получается ;)


Цитата(Elfet @  5.12.2006,  21:20 Найти цитируемый пост)
Видимо мне алгоритм нужен, раз так форум называется ;)


чего-то я ничего не понимаю...
алгоритм описан, если что-то в нём непонятно, то надо сказать что, иначе никто не сможет помочь...


--------------------
qqq
PM WWW   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Алгоритмы"

maxim1000

Форум "Алгоритмы" предназначен для обсуждения вопросов, связанных только с алгоритмами и структурами данных, без привязки к конкретному языку программирования и/или программному продукту.


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, maxim1000.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Алгоритмы | Следующая тема »


 




[ Время генерации скрипта: 0.0532 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.