Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2015.02.15;
Скачать: CL | DM;

Вниз

Стрелки   Найти похожие ветки 

 
ghostdelvonte   (2014-01-04 23:27) [0]

Доброго времени суток!

Господа, помогите, всю голову уже сломал, мне такое не под силу похоже...
Один сайт попросил написать программу, где по точкам рисуются линии, линии могут распологаться как угодно и под любым углом, в конце (в самом конце), на последней линии надо нарисовать стрелки, как показано на рисунке http://my.mail.ru/mail/ghostdelvonte/photo?album_id=738#photo=/mail/ghostdelvonte/738/750

не могу понять как рассчитать эти стрелки, ничего не выходит...


 
ghostdelvonte   (2014-01-04 23:29) [1]

Ссылка неправильная, вот http://content.foto.mail.ru/mail/ghostdelvonte/738/h-750.jpg


 
Inovet ©   (2014-01-04 23:41) [2]

Угол наклона линии относительно осей известен, угол линий стрелки относительно линии задан, длина линий стрелки задана. Вроде же всё просто.


 
ghostdelvonte   (2014-01-04 23:47) [3]

А для меня это не просто, я как только не извращался, ничего не выходит, вроде стрелку нарисовал, изменил имя на другое - нет стрелки!

Кому интересно, вот эта программа на тестировании, все уже сделано остались эти несчастные стрелки, а я любитель в программировании...

http://content-27.foto.mail.ru/mail/ghostdelvonte/738/s-749.bmp

Не обращайте внимание на интерфейс, я не художник, это просто наброски...
Сайт связан с мистикой)


 
Palladin ©   (2014-01-05 00:21) [4]

не программист, не художник, а сайты у тебя программы просят рисовать...
потрясающе


 
Ghost del vonte ©   (2014-01-05 00:24) [5]

Никого больше не оказалось... да и к тому же не за деньги это...

Подскажите, вот начальная точка, скажем X - 455, Y - 288, а конечная
X - 355, Y - 388, как на последней точке нарисовать стрелку относительно линии?


 
sniknik ©   (2014-01-05 01:30) [6]

> и к тому же не за деньги это...
на халяву и как у тебя показано пойдет. не парься.


 
ghost del vonte ©   (2014-01-05 16:08) [7]


> на халяву и как у тебя показано пойдет. не парься.


Меня никто и не заставлял, я сам согласился, потому-что мне нравится программирование...

Я знаю, здесь есть добрые люди... которые помогут.
Благодарю за ответы)


 
RWolf ©   (2014-01-05 16:24) [8]

Если нравится программирование, то не должно быть никаких затруднений посчитать координаты конечных точек с помощью нехитрых тригонометрических построений и провести две линии. Это же самая суть программирования — строить мат.модель задачи и переносить её в код.


 
ghost del vonte ©   (2014-01-05 16:55) [9]


> Если нравится программирование, то не должно быть никаких
> затруднений посчитать координаты конечных точек с помощью
> нехитрых тригонометрических построений и провести две линии.
>  Это же самая суть программирования — строить мат.модель
> задачи и переносить её в код.


Я познаю что-то по мере необходимости, к тому же туго с математикой... потому и обращаюсь сюда за помощью, т.к. сам не осилю...

Есть три массива, ENGWord, ENG_X, ENG_Y, в первом находится алфавит, во втором и третьем позиции точек относительно X и Y их координат, при сканировании имени в другой класс заносятся все позиции букв из первого массива, и по второму и третьему массиву и происходит рисование, а вот как в конце стрелки нарисовать ума не приложу, не хватает моих мозгов и знаний, не сталкивался с этим еще ни разу...


     mX:= Length(Edit1.Text);
     mY:= (Length(Edit1.Text) - 1);
     mask1.Canvas.LineTo(rInf.rX[mX], rInf.rY[mX]);
     mask1.Canvas.LineTo((rInf.rX[mY]-10), (rInf.rY[mY]-50));
     mask2.Canvas.LineTo(rInf.rX[mX], rInf.rY[mX]);
     mask2.Canvas.LineTo((rInf.rX[mY]-10), (rInf.rY[mY]-50));
     mask1.Canvas.MoveTo(rInf.rX[mX], rInf.rY[mX]);
     mask2.Canvas.MoveTo(rInf.rX[mX], rInf.rY[mX]);
     mask1.Canvas.LineTo(rInf.rX[mX], rInf.rY[mX]);
     mask1.Canvas.LineTo((rInf.rX[mY]+10), (rInf.rY[mY]-50));
     mask2.Canvas.LineTo(rInf.rX[mX], rInf.rY[mX]);
     mask2.Canvas.LineTo((rInf.rX[mY]+10), (rInf.rY[mY]-50));


Вот этот код правильно отрисовывает стрелку, но только у того имени, что на скрине показано, а у других ее либо попросту нет, либо она нереально длинная и кривая...
rInf это класс, там поле с именем и два поля-массивы rInf.rX и rInf.rY, в которые заносятся позиции X и Y текущей, отрисовываемой буквы...


 
Dennis I. Komarov ©   (2014-01-06 14:02) [10]

Эх, тангенсы, котангенсы... :)


 
SergP ©   (2014-01-06 14:59) [11]

пусть координаты точки со стрелкой x,y
координаты хвоста отрезка x1,y1

dx:=x1-x;
dy:=y1-y;

Длина отрезка
S:=sqrt(dx*dx+dy*dy);

угол наклона отрезка a

sin(a)=dy/S
cos(a)=dx/S

пусть угол стрелок относительно отрезка b

тогда угол наклона линий стрелок относительно оси X будет a+b и a-b

Вспоминаем школьный курс математики:

sin(a+-b)=sin(a)*cos(b)+- cos(a)*sin(b)
cos(a+-b)=cos(a)*cos(b)-+sin(a)*sin(b)

координаты концов отрезков стрелок соответственно:

xs=x+R*cos(a+-b)
ys=y+R*sin(a+-b)

ну вот в принципе и все.

sin(b) и cos(b) - вычислять не нужно, это константы.

к тому же если взять угол 15 градусов, то синус его приблизительно равен 0.25, а косинус довольно близок к 1, и будет небольшая погрешность если мы будем считать его 1.

тогда можно cделать так:
Е:=R/(S*4);

xs1:=x+trunc(E*(dx shl 2 - dy));
ys1:=y+trunc(E*(dy + dx shl 2));

xs2:=x+trunc(E*(dx shl 2 + dy));
ys2:=y+trunc(E*(dy - dx shl 2));

вобщем не исключено что я где-нить мог ошибиться (под руками ни дельфи, ни нормальных условий, чтобы подумать нет), но принцип должен быть верным.


 
SergP ©   (2014-01-06 15:30) [12]

R-длина стрелок


 
SergP ©   (2014-01-07 01:40) [13]


>
> xs1:=x+trunc(E*(dx shl 2 - dy));
> ys1:=y+trunc(E*(dy + dx shl 2));
>
> xs2:=x+trunc(E*(dx shl 2 + dy));
> ys2:=y+trunc(E*(dy - dx shl 2));
>


ну возможно лучше Round вместо Trunc


 
Германн ©   (2014-01-07 01:54) [14]


> Вспоминаем школьный курс математики:
>

После 40-ка это не сложно. В 20-ть это почти нереально, ибо в школах уже давно не изучают математику сложнее таблицы умножения. Её только "проходят".
:)


 
SergP ©   (2014-01-08 22:56) [15]


> SergP ©   (06.01.14 14:59) [11]


там все-таки оказалась небольшая ошибка.
Вот уже имея под рукой Дельфи и проверивши, получилось так:


procedure Strelka(Linefrom:TPoint;LineTo:TPoint;Canvas:TCanvas);
var
dx,dy:integer;
S:Extended;
const
R:Integer=15;
begin
dx:=Linefrom.X-LineTo.X;
dy:=Linefrom.Y-LineTo.Y;
S:=R/(4*sqrt(dx*dx+dy*dy));
Canvas.MoveTo(Linefrom.X,Linefrom.Y);
Canvas.LineTo(LineTo.X,LineTo.Y);
Canvas.MoveTo(LineTo.X+Round(S*(dx shl 2 - dy)),LineTo.Y+Round(S*(dy shl 2 + dx)));
Canvas.LineTo(LineTo.X,LineTo.Y);
Canvas.LineTo(LineTo.X+Round(S*(dx shl 2 + dy)),LineTo.Y+Round(S*(dy shl 2 - dx)));
end;



Страницы: 1 вся ветка

Текущий архив: 2015.02.15;
Скачать: CL | DM;

Наверх




Память: 0.51 MB
Время: 0.005 c
2-1389704106
Marsovick
2014-01-14 16:55
2015.02.15
SQL запрос


2-1389859637
JohnKorsh
2014-01-16 12:07
2015.02.15
Работа с целыми числами, превышающими Int64


15-1405358878
Юрий Зотов
2014-07-14 21:27
2015.02.15
Нужны идеи.


2-1389616067
Alex_C
2014-01-13 16:27
2015.02.15
Контертировать string[10] в XE2


2-1389278898
Мимо прогодивший
2014-01-09 18:48
2015.02.15
методы отрисовки графики в ОС Windows