Форум: "Начинающим";
Текущий архив: 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