|
|
« Предыдущая тема | Следующая тема » |
Опции темы | Опции просмотра |
|
|
|||||
Регистрация: Aug 2006
Сообщений: 134
|
Построение четырехугольника по произвольных точек
Задача: построить выпуклый 4хугольник по произвольно расположенным 4м точкам. Трудность заключается в том, чтобы расположить точки последовательно друг за другом в массиве:
[IMG]http://s44.***********/i103/1009/ef/93e56e3fb9c6.gif[/IMG] Может кто-нибудь подсказать алгоритм, как выстроить точки?
__________________
я только учусь... |
|
|||||
Регистрация: Jan 2006
Адрес: Novosibirsk
Сообщений: 353
|
а что вам мешает выстраивать их последовательно??
|
|
|||||
Регистрация: Feb 2008
Сообщений: 560
|
Попробуйте алгоритм во вложении. Строит вроде даже не выпуклые, а с выпуклыми проблем вообще быть не должно. Код такой:
var pts = new Array(); for (var i=1; i<=4; i++) { pts.push({ x:Math.floor(Math.random() * Stage.width), y:Math.floor(Math.random() * Stage.height) }); } var ax = 0; var ay = 0; for (var i=0; i<4; i++) { ax += pts[i].x/4; ay += pts[i].y/4; this.attachMovie('point', 'point'+i, this.getNextHighestDepth(), { _x:pts[i].x, _y:pts[i].y }); } for (var i=0; i<4; i++) { pts[i].a = Math.atan2(pts[i].y - ay, pts[i].x - ax); } pts = pts.sortOn("a", Array.NUMERIC); this.lineStyle(2, 0x0000FF, 100); this.moveTo(pts[3].x, pts[3].y); for (var i=0; i<4; i++) { this.lineTo(pts[i].x, pts[i].y); } |
|
|||||
Регистрация: Aug 2006
Сообщений: 134
|
Цитата:
rainbowrussia, спасибо. Это то, что нужно. Примерно такой метод уже сами нашли. Только через отношение остальных точек к полуплоскости образованной прямой(вектором) между произвольными двумя точками и последовательным перебором пар точек.
__________________
я только учусь... |
|
|||||
Регистрация: Jun 2008
Сообщений: 204
|
Можете показать?
|
|
|||||
Регистрация: Aug 2006
Сообщений: 134
|
Цитата:
function sign(a,b){ var sign if(a._x*b._y - a._y*b._x >= 0){ sign = 1 }else{ sign = -1 } return sign; } arr_in = [{_x:569.55,_y:218.35},{_x:566.45,_y:172.2},{_x:521.75,_y:218.35},{_x:519.55,_y:172.2}]; arr_all = arr_in.concat([]); arr_out = []; arr_out.push(arr_in.shift()); while(arr_in.length > 0){ var correct = false; var p1 = arr_out[arr_out.length - 1]; var p2 = arr_in.shift(); var a = {_x : p2._x-p1._x,_y : p2._y-p1._y} while(!correct){ var sum = 0; for(var i = 0; i < arr_all.length; i++){ var b = {_x : arr_all[i]._x-p1._x,_y : arr_all[i]._y-p1._y}; sum += sign(a,b) } if((Math.abs(sum)/arr_all.length) ==1 || arr_all.length == 0) { correct = true; }else{ arr_in.push(p2); p2 = arr_in.shift(); a = {_x : p2._x-p1._x,_y : p2._y-p1._y} } } arr_out.push(p2) } _root.lineStyle(1,0xff0000); _root.beginFill(0x000000,50); _root.moveTo(arr_out[0]._x,arr_out[0]._y); trace("x = "+arr_out[0]._x +" ; y ="+ arr_out[0]._y) _root.attachMovie("id","id_"+0,0,arr_out[0]); for(var i = 1; i < arr_out.length; i++ ){ _root.attachMovie("id","id_"+i,i,arr_out[i]); trace("x = "+arr_out[i]._x +" ; y ="+ arr_out[i]._y) _root.lineTo(arr_out[i]._x,arr_out[i]._y); } _root.lineTo(arr_out[0]._x,arr_out[0]._y); _root.endFill();
__________________
я только учусь... |
|
|||||
Регистрация: Jun 2008
Сообщений: 204
|
Да вы полностью правы, не знаю насчет производительности (как раз хотел потестить), но насчет стройности и чистоты кода, конечно же первый метод намного лучше. Спасибо за код.
|
Часовой пояс GMT +4, время: 16:54. |
|
« Предыдущая тема | Следующая тема » |
Опции темы | |
Опции просмотра | |
|
|