Текущий архив: 2007.07.08;
Скачать: CL | DM;
Вниз
Расчет координат Найти похожие ветки
← →
Наиль © (2006-08-22 14:52) [40]Я начал писать до того как, MBo реализовал мой алгоритм.
Поэтому дальнейший текст немного запоздалый.
Я не зря написал, что приведёный автором алгоритм не плох.
Тем более, что если его грамотно переписать, то он займёт строчек 15-20.
Мой алгоритм не намного лучше, или хуже.
Но есть некоторые моменты на которые стоит обратить внимание.
1. Лестница
if then else
if then else
будет одинаковая в обоих алгоритмах (или на ступеньку больше, в моём случае)
2. Даже для линий с углом наклона 25/18 можно подобрать целочисленную формулу. (что-то вроде 18*x+a<25*y+b)
3. В авторском варианте вероятность угадать гексогон с первого сравнения значительно выше.
4. В моём случае три очень простых условия и четыре else.
Я считаю, что единственый недостаток авторского кода в большом количестве sqr.
← →
Селезин © (2006-08-22 16:59) [41]А есть другой способ вычисления расстояний?
В принципе, sqr выносится "за скобки"
Xleft := (X-32) div 50; {приближенные координаты - поиск по прямоугольнику аналогично [27]}
YTop := (Y-25) div 50;
X1 := Xleft*50+32; {координаты центроа соседних гексов}
X2 := X1+50;
Y1 := YTop*50+25; {координаты центров соседних гексов}
Y2 := Y1+25;
Y3 := Y2+25;
sqr1:=sqr(X-X1);
sqr2:=sqr(X-X2);
sqr3:=sqr(X-Y1);
sqr4:=sqr(X-Y2);
sqr5:=sqr(X-Y3);
{определение расстояний до центров трех гексов, входящих в прямоугольник}
if (Odd(XLeft)) then
if (sqr2+sqr4<=sqr1+sqr3) AND (sqr2+sqr4<=sqr1+sqr5) then Inc(XLeft);
else
if (sqr1+sqr5<=sqr1+sqr3) AND (sqr1+sqr5<=sqr2+sqr4) then Inc(YTop)
else
if (sqr2+sqr3<=sqr1+sqr4) AND (sqr2+sqr3<=sqr2+sqr5) then Inc(XLeft);
else
if (sqr2+sqr5<=sqr1+sqr4) AND (sqr2+sqr5<=sqr2+sqr3) then
begin
Inc(XLeft);
Inc(YTop);
end;
label1.Caption := "("+IntToStr(XLeft)+":"+IntToStr(YTop)+")";
← →
Селезин © (2006-08-22 17:08) [42]Ну да, у меня условия посложнее, и их меньше. А как еще расстояния вычислить?
Кстати, сейчас заметил, условия с sqrN, разделенные else, лучше поменять местами - вероятность попадания в первую проверку больше (около 40%)
← →
ANTPro © (2006-08-22 19:14) [43]Селезин © (22.08.06 17:08) [42]
alphaWind1.Caption := ...
Замени Label на вот это и забудешь про тормоза:
Form1.Canvas.Brush.Color:=clInfoBk;//Цвет фона
Form1.Canvas.Pen.Color:=clBlack; //Цвет Текста
Form1.Canvas.Rectangle(0,0,105,25);//Фон для красоты
Form1.Canvas.TextOut(5,5,"X="+Int2Digs(X,3)+" Y="+Int2Digs(Y,3));//Вывод текста
ЗЫ: Надо будет обновлять, через OnPaint.
Страницы: 1 2 вся ветка
Текущий архив: 2007.07.08;
Скачать: CL | DM;
Память: 0.54 MB
Время: 0.023 c