2013-06-19 22 views
12

Cách tốt nhất (cả mã khôn ngoan và hiệu năng) để kiểm tra xem hai hình dạng được vẽ bởi svg path có giao nhau không? Tôi đang thực hiện điều này trong d3 và đang sử dụng "đóng dấu chính" trong sốgiao nhau với đường dẫn khép kín svg

Cụ thể hơn, tôi đang tạo vỏ lồi (phức tạp hơn trong hình ảnh) và tôi muốn kết hợp vỏ nếu chúng chồng lên nhau. Sẽ dễ dàng nếu tôi sử dụng nội suy "tuyến tính đóng", vì sau đó tôi có thể sử dụng các đỉnh để tính các giao lộ, nhưng nội suy "hồng y đóng" trông tốt hơn khi tôi sử dụng nó.

var v1 = [[100,100],[200,100],[200,200],[100,200]], 
v2 = [[210,100],[310,100],[310,200],[210,200]]; 

var hull1 = d3.geom.hull(v1), 
    hull2 = d3.geom.hull(v2); 

var svg = d3.select("#foo") 
    .append("svg"); 

var line = d3.svg.line() 
    .interpolate("cardinal-closed") 
    .x(function(d) {return d[0];}) 
    .y(function(d) {return d[1];}); 

svg.append("path") 
    .attr("d", line(hull1)); 
svg.append("path") 
    .attr("d", line(hull2)); 

Output of code

Đây là một jsfiddle. Làm cách nào để kiểm tra xem các hình dạng này có giao nhau/chồng chéo không?

+0

Tôi nghĩ rằng bạn sẽ phải nhận được vào nitty-gritty của sao 'đường hồng y-closed' được thực hiện. Giống như, nếu bạn đặt nó thành 'tuyến tính', hai hình dạng không giao nhau. Vì vậy, một cái gì đó về cách này (http://en.wikipedia.org/wiki/Cubic_Hermite_spline#Cardinal_spline) xảy ra sẽ phải được đưa vào tài khoản khi đến với một bài kiểm tra – elsherbini

+7

Bạn có thể sử dụng [thư viện giao lộ tuyệt vời từ Kevin Lindsey] (http://www.kevlindev.com/geometry/2D/intersections/index.htm) để kiểm tra xem có hai hình SVG giao nhau hay không. – Phrogz

+0

Cảm ơn bạn @Phrogz, thư viện đó thực sự tuyệt vời !! :) – swenedo

Trả lời