gpt4 book ai didi

svg - 在圆弧 SVG 上应用平移旋转和缩放后获取新路径

转载 作者:行者123 更新时间:2023-12-02 04:44:26 27 4
gpt4 key购买 nike

我想在路径上应用平移旋转和缩放后获得新的路径(弧)点。我举个例子:

我的路径是这样显示的

<强>如您所见,在我的路径上应用了翻译、旋转和缩放。

我正在使用此代码通过 translate(0,0) rotate(0,0,0) 和 scale(0,0) 获取新路径 我正在使用 matrixTransform(sCTM) 方法在以下情况下获取新点应用新的变换和缩放后的线。但在弧的情况下,我没有得到正确的路径。

var path = d3.select("g")[0][0]; // Get g tag
var d = "";
// console.log(path.select('path').getAttr('d'));
var sCTM = path.getCTM(); // get transform data
var svgRoot = path.ownerSVGElement // get svg tag
var pathId = d3.select("g path")[0][0]; // get path
var segList = pathId.pathSegList //
var segs = segList.numberOfItems
//---change segObj values
// create D after apply transform elements
for (var k = 0; k < segs; k++) {
var segObj = segList.getItem(k)
if (segObj.x && segObj.y) {
var mySVGPoint = svgRoot.createSVGPoint();
mySVGPoint.x = segObj.x
mySVGPoint.y = segObj.y
mySVGPointTrans = mySVGPoint.matrixTransform(sCTM)
console.log("testing my object",mySVGPointTrans);
segObj.x = mySVGPointTrans.x;
segObj.y = mySVGPointTrans.y;
d = d + segObj.pathSegTypeAsLetter + mySVGPointTrans.x + "," + mySVGPointTrans.y;
}
}
d3..select("g").select("path").attr("d",d);
//---force removal of transform--
path.setAttribute("transform", "translate(0,0)rotate(0,0,0)skewX(0)scale(1,1)");

最佳答案

IN the case of line the Matrix return 2 value x point and y point . but in the case of arc the matrix retuen 6 value cx cy rotation swepflag largefalg x y. in this code first i check path is arc or line if line then add the x,y coordinate only but in the case of arc i add all 6 point to the make new path arc path.

var path = d3..select("g")[0][0]; // Get g tag
var d = "";
// console.log(path.select('path').getAttr('d'));
var sCTM = path.getCTM(); // get transform data
var svgRoot = path.ownerSVGElement // get svg tag
var pathId = d3.select("g path")[0][0]; // get path
var segList = pathId.pathSegList //
var segs = segList.numberOfItems
//---change segObj values
// create D after apply transform elements
for (var k = 0; k < segs; k++) {
var segObj = segList.getItem(k)
if(segObj.pathSegTypeAsLetter != "A" && segObj.pathSegTypeAsLetter !="a") {``
if (segObj.x && segObj.y) {
var mySVGPoint = svgRoot.createSVGPoint();
mySVGPoint.x = segObj.x
mySVGPoint.y = segObj.y
mySVGPointTrans = mySVGPoint.matrixTransform(sCTM)
console.log("testing my object",mySVGPointTrans);
segObj.x = mySVGPointTrans.x;
segObj.y = mySVGPointTrans.y;
d = d + segObj.pathSegTypeAsLetter + mySVGPointTrans.x + "," + mySVGPointTrans.y;
}
} else {
// to check the arc have rotation value of x and y
if (segObj.x && segObj.y && segObj.r1 && segObj.r2) {
var mySVGPoint = svgRoot.createSVGPoint();
mySVGPoint.x = segObj.x
mySVGPoint.y = segObj.y
mySVGPoint.r1 = segObj.r1
mySVGPoint.r2 = segObj.r2
mySVGPoint.angle = segObj.angle
mySVGPoint.largeArcFlag = segObj.largeArcFlag
mySVGPoint.sweepFlag = segObj.sweepFlag;
mySVGPointTrans = mySVGPoint.matrixTransform(sCTM)
segObj.x = mySVGPointTrans.x
segObj.y = mySVGPointTrans.y
var largeFlag = segObj.largeArcFlag ? 1 : 0 ;
var sweepFlag = segObj.sweepFlag ? 0 : 1;
//add all parameter when arc
d = d + segObj.pathSegTypeAsLetter + segObj.r1 + "," + segObj.r2 + " " + segObj.angle + " " + largeFlag + " " + sweepFlag + " " + mySVGPointTrans.x + "," + mySVGPointTrans.y;
}

}
}
d3..select("g").select("path").attr("d",d);
//---force removal of transform--
path.setAttribute("transform", "translate(0,0)rotate(0,0,0)skewX(0)scale(1,1)");

关于svg - 在圆弧 SVG 上应用平移旋转和缩放后获取新路径,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34448574/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com