닫힌 다각형을 나타내는 선분 배열을 생성하는 라이브러리 (JavaScript-Voronoi)를 사용하고 있습니다. 이러한 세그먼트는 정렬되지 않은 순서로 나타나며 세그먼트가 나타나는 순서와 세그먼트의 각 끝에 대한 점의 순서가 모두 표시됩니다. 효율적으로 선분을 루프로 정렬
(편집 : 아래의 코멘트에서 언급 한 바와 같이, 내가 잘못했다 : 라이브러리 에서 세그먼트들이 잘 주문하지만, 질문은 서면으로 약자.의이 세그먼트가없는 것으로 가정하자 어떤 주문, 이것은 더 일반적으로 유용합니다으로) 예를 들어
:.
var p1 = {x:13.6,y:13.1}, p2 = {x:37.2,y:35.8}, p3 = {x:99.9,y:14.6},
p4 = {x:99.9,y:45.5}, p5 = {x:33.7,y:66.7};
var segments = [
{ va:p1, vb:p2 },
{ va:p3, vb:p4 },
{ va:p5, vb:p4 },
{ va:p3, vb:p2 },
{ va:p1, vb:p5 } ];
공지 방법 마지막으로 첫 번째 세그먼트 연결합니다 (y는 공통점을 공유 함), 마지막에서 두 번째까지. 모든 세그먼트가 정확히 하나의 다른 세그먼트와 끝을 공유 함을 보장합니다.
내가 적절한 SVG 다각형을 생성하는 지점의 목록에이 변환하고자하는:
console.log(orderedPoints(segments));
// [
// {"x":33.7,"y":66.7},
// {"x":13.6,"y":13.1},
// {"x":37.2,"y":35.8},
// {"x":99.9,"y":14.6},
// {"x":99.9,"y":45.5}
// ]
점은 시계 방향 또는 반 시계 방향으로 순서에 있는지 그것은 중요하지 않습니다.
다음 코드는 제가 생각해 냈습니다. 그러나 최악의 시나리오에서는 n^2+n
포인트 비교가 필요합니다. 이 모든 것을 함께 결합하는보다 효율적인 알고리즘이 있습니까?
function orderedPoints(segs){
segs = segs.concat(); // make a mutable copy
var seg = segs.pop(), pts = [seg.va], link = seg.vb;
for (var ct=segs.length;ct--;){
for (var i=segs.length;i--;){
if (segs[i].va==link){
seg = segs.splice(i,1)[0]; pts.push(seg.va); link = seg.vb;
break;
}else if (segs[i].vb==link){
seg = segs.splice(i,1)[0]; pts.push(seg.vb); link = seg.va;
break;
}
}
}
return pts;
}
은 볼록한 다각형입니까? 또는 합리적인 요구 사항이 아닌가? – thang
@ thang 모든 보로 노이 다이어그램 셀은 항상 볼록하다고 믿습니다. – Phrogz
[JavaScript-Voronoi] (https://github.com/gorhill/Javascript-Voronoi)를 사용하는 사람들은 다음을 통해 셀의 폴리곤 포인트를 매우 쉽게 얻을 수 있다는 것을 알았습니다 :'cell.halfedges.map (함수 (he) {return he.getStartpoint()})'; 위에서 말한 것에도 불구하고 실제로 가장자리는 이미 반 시계 방향으로 정렬되어 있습니다. – Phrogz