我正在嘗試使用JS Clipper對SVG路徑(包含beziers,包括二次和立方體)執行布爾操作。將SVG路徑轉換爲用於Javascript Clipper的多邊形
JS Clipper以多邊形開始,然後執行操作,然後它似乎將它們轉換回SVG路徑。
下面的函數給出了一個SVG路徑,但下面的示例以2個多邊形開始。
一個例子功能:
// Polygon Arrays are expanded for better readability
function clip() {
var subj_polygons = [
[{
X: 10,
Y: 10
}, {
X: 110,
Y: 10
}, {
X: 110,
Y: 110
}, {
X: 10,
Y: 110
}],
[{
X: 20,
Y: 20
}, {
X: 20,
Y: 100
}, {
X: 100,
Y: 100
}, {
X: 100,
Y: 20
}]
];
var clip_polygons = [
[{
X: 50,
Y: 50
}, {
X: 150,
Y: 50
}, {
X: 150,
Y: 150
}, {
X: 50,
Y: 150
}],
[{
X: 60,
Y: 60
}, {
X: 60,
Y: 140
}, {
X: 140,
Y: 140
}, {
X: 140,
Y: 60
}]
];
var scale = 100;
subj_polygons = scaleup(subj_polygons, scale);
clip_polygons = scaleup(clip_polygons, scale);
var cpr = new ClipperLib.Clipper();
cpr.AddPolygons(subj_polygons, ClipperLib.PolyType.ptSubject);
cpr.AddPolygons(clip_polygons, ClipperLib.PolyType.ptClip);
var subject_fillType = ClipperLib.PolyFillType.pftNonZero;
var clip_fillType = ClipperLib.PolyFillType.pftNonZero;
var clipTypes = [ClipperLib.ClipType.ctUnion];
var clipTypesTexts = "Union";
var solution_polygons, svg, cont = document.getElementById('svgcontainer');
var i;
for (i = 0; i < clipTypes.length; i++) {
solution_polygons = new ClipperLib.Polygons();
cpr.Execute(clipTypes[i], solution_polygons, subject_fillType, clip_fillType);
console.log(polys2path(solution_polygons, scale));
}
}
// helper function to scale up polygon coordinates
function scaleup(poly, scale) {
var i, j;
if (!scale) scale = 1;
for (i = 0; i < poly.length; i++) {
for (j = 0; j < poly[i].length; j++) {
poly[i][j].X *= scale;
poly[i][j].Y *= scale;
}
}
return poly;
}
// converts polygons to SVG path string
function polys2path(poly, scale) {
var path = "",
i, j;
if (!scale) scale = 1;
for (i = 0; i < poly.length; i++) {
for (j = 0; j < poly[i].length; j++) {
if (!j) path += "M";
else path += "L";
path += (poly[i][j].X/scale) + ", " + (poly[i][j].Y/scale);
}
path += "Z";
}
return path;
}
無論多麼複雜,此解決方案都適用於任何形狀嗎?由於多邊形轉換的路徑,我已經放棄嘗試使用您的庫。我確實設法從Phrogz使用這種方法:https://gist.github.com/Phrogz/845901轉換爲只有一個大問題的多邊形。我的用戶應該繪製非常非常複雜的彎曲形狀,必須進行布爾運算,而不會損失任何曲線上的保真度。這需要超過800個採樣所需的多邊形,這在大多數情況下甚至不能用Phrogz解決方案工作。你相信Raphael + AG會更好嗎? – 2013-04-10 10:24:47
我的解決方案僅適用於svg路徑,因此您需要先將其他形狀轉換爲路徑(請參閱:https://github.com/johan/svg-js-utils/blob/master/paths.js,pathify() -功能)。我認爲轉換質量非常好(因爲您可以使用我建議的解決方案使用角度閾值和總體縮放參數來調整精度)。而且我也測試了Phrogz的解決方案,這是典型的強力方法,當形狀複雜且容易產生太多或太少的點時,解決方案很慢。 Antigrain解決方案產生最佳點數。什麼是AG? – 2013-04-10 15:26:22
如果我看到足夠的代碼,我可以嘗試提供幫助。您可以使用[email protected]與我聯繫。也許更好的是,我們通過電子郵件繼續討論,找到解決方案後,在此發佈所需的步驟或功能。 – 2013-04-10 15:37:14