Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 2015.02.15;
Скачать: [xml.tar.bz2];

Вниз

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

 
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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.49 MB
Время: 0.002 c
2-1389616067
Alex_C
2014-01-13 16:27
2015.02.15
Контертировать string[10] в XE2


15-1405343958
Ega23
2014-07-14 17:19
2015.02.15
Батя задачку выдал, а ответа так и не сказал. :)


15-1404595805
Юрий
2014-07-06 01:30
2015.02.15
С днем рождения ! 6 июля 2014 воскресенье


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


2-1389268749
Никита Парфенов
2014-01-09 15:59
2015.02.15
Как лучше конектиться к Firebird?





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский