Просмотр полной версии : определить наименьшую дистанцию между Point-ами
vitamin4er
12.05.2013, 21:14
Здравствуйте! Ситуация следующая: есть массив с point-ами, и есть функция(отвечающая за нажатие мыши), и еще есть спрайт. Задача: определить ближайшую к нажатию мыши точку, и присваивать спрайту координаты точки. Так вот, при нажатие мыши создается еще одна точка(point) с координатами мыши...и тут я думал перебирать массив узнавая дистанцию, потом дистанции сортировать и брать первую(наименьшую), но возникла проблема - как узнать от какой точки, собственно, эта дистанция...и других путей решения я не вижу. Может кто видит, поделитесь пожалуйста. Спасибо!
Задача: определить ближайшую к нажатию мыши точку, и присваивать спрайту координаты точки.
Можно чуть определенней?
P.S. Если из массива точек выбирать ближайшую к клику мышки, то что тут сложного?
vitamin4er
12.05.2013, 21:25
P.S. Если из массива точек выбирать ближайшую к клику мышки, то что тут сложного?
присвоить спрайту координаты этой точки. Может это и очевидно, но я чтот не могу додуматься
Добавлено через 3 минуты
точнее,присвоить координаты легко! я как раз не могу найти ближайшую точку...если не сложно, опишите вкратце!
Idon'tKnow
12.05.2013, 21:31
Хранить в веторах:
1. Координату по х.
2. Координату по у.
Для всех точек, далее используешь формулу. Расстояние между точками = Корень из ((x1-x2)^2 + (y1-y2)^2)
Если нашлось расстояние меньше, чем текущее - присваиваешь это расстояние в минимум, а также обновляешь номер этой точки в Vector'e. Изначально, можешь задать для минимума больше значение, чтобы расстояние минимальное точно было меньше его, допустим 10000000. Всё ясно?
Вкратце: сначала диагональ до любого поинта, если равны,то на ваш вкус.
function nearPoint(event:MouseEvent):Point
{
var mouse:Point = new Point(event.localX, event.localY);
var minDistance:Number = Number.MAX_VALUE;
var point:Point;
for(var i:uint = 0; i < _points.length; i++)
{
var p:Point = _points[i];
var d:Number = Point.distance(mouse, p);
if(minDistance > d)
{
minDistance = d;
point = p;
}
}
return point;
}
vitamin4er
12.05.2013, 23:11
Wolsh, спасибо!
Point distance внутри себя содержит извлечение корня, который 'типа' медленный. Я это к тому, что можно сравнивать не извлекая корень:var d:Number = (mouse.x - p.x)*(mouse.x - p.x) + (mouse.y - p.y)*(mouse.y - p.y)
Idon'tKnow
13.05.2013, 00:59
Да, это может привести к неверному ответу.
Zebestov
13.05.2013, 02:06
Idon'tKnow, неправда.
>>дистанции сортировать и брать первую(наименьшую), но возникла проблема - как узнать от какой точки, собственно, эта дистанция..
у штатной сортировки есть опция для выдачи индексов, не трогая сам массив
для этой задачки это:
private function nearPointIndx():int
{
return _points.sort(sortFunc, Array.RETURNINDEXEDARRAY)[0];
}
private function sortFunc(a:Point, b:Point):Number
{
var mouse:Point = new Point(mouseX, mouseY);
return Point.distance(mouse, a) > Point.distance(mouse, b) ? 1 : -1;
}
но это так, для полноты картины только, как Wolsh предложил поскладнее будет
Idon'tKnow
13.05.2013, 21:11
Idon'tKnow, неправда.
Хм, а почему неправда? Допустим есть 2 точки с нереально большими суммами координат по х и по у.
Вот например, как легко ломается нигма на больших значениях:
Тык. (http://nigma.ru/?s=%D0%BA%D0%BE%D1%80%D0%B5%D0%BD%D1%8C+%D0%B8%D0%B7%2810%5E100%29+%3C+%D0%BA%D0%BE%D1%80%D0%B5%D0%BD%D1%8C+%D0%B8%D0%B7%289.999999999999999999999999% 5E100%29&t=web&rg=t%3D%D0%98%D0%B6%D0%B5%D0%B2%D1%81%D0%BA_c%3D%D0%A0%D0%BE%D1%81%D1%81%D0%B8%D1%8F_&rg_view=%D0%98%D0%B6%D0%B5%D0%B2%D1%81%D0%BA%D0%B5&yn=1&gl=1&rm=1&ms=1&yh=1&av=1&nm=1&lang=all&srt=0&sf=1)
А вот, что мне выдает FD.
package
{
import flash.display.Sprite;
import flash.events.Event;
public class Main extends Sprite
{
public function Main():void
{
if (stage) init();
else addEventListener(Event.ADDED_TO_STAGE, init);
}
private function init(e:Event = null):void
{
removeEventListener(Event.ADDED_TO_STAGE, init);
// entry point
var num1:Number = 10;
var num2:Number = 9.9999999999999999;
trace(num1 == num2); // true
}
}
}
Может, конечно, я что-то пишу неверно, выслушаю критику. :)
P.S. Я прекрасно понимаю, что таких случаев быть не может на 99.9% , скорее всего, но зачем рисковать?
Zebestov
13.05.2013, 22:07
…можно сравнивать не извлекая корень
…это может привести к неверному ответу
По твоему мнению, опуская извлечение корня, мы искажаем ответ. Это неправда. Допишу в твой пример одну строчку.
var num1:Number = 10;
var num2:Number = 9.9999999999999999;
trace(num1 == num2); // true
trace(Math.sqrt(num1) == Math.sqrt(num2)); // true (внезапно)
Вопрос — зачем корни считали?
Важно даже не то, что в 99.9% случаев все будет хорошо, а то, что в 100% случаев это будет несущественно.
Idon'tKnow
13.05.2013, 22:42
Zebestov, Да я на горячую голову писал. Думал одно, писал другое. Я писал про то, что операцию корня не нужно использовать, она и может привести к неверному ответу. К нему и приводил примеры, правда сейчас понимаю, что если числа всё равно округляются, то ошибки просто не получится избежать. Точнее, когда я писал
Работает на vBulletin ® версия 3.7.3. Copyright ©2000-2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Copyright © 1999-2008 Flasher.ru. All rights reserved.