gpt4 book ai didi

javascript - 绘制反转圆弧改变圆心坐标

转载 作者:行者123 更新时间:2023-12-01 01:44:43 25 4
gpt4 key购买 nike

我正在使用this piece of code绘制弧线,到目前为止效果很好,但是我遇到了 textPath 的问题我无法弄清楚。

请运行以下代码片段。

function polarToCartesian(centerX, centerY, radius, angleInDegrees) {
var angleInRadians = (angleInDegrees-90) * Math.PI / 180.0;

return {
x: centerX + (radius * Math.cos(angleInRadians)),
y: centerY + (radius * Math.sin(angleInRadians))
};
}

function describeArc(x, y, radius, startAngle, endAngle){

var start = polarToCartesian(x, y, radius, endAngle);
var end = polarToCartesian(x, y, radius, startAngle);

var largeArcFlag = endAngle - startAngle <= 180 ? "0" : "1";

var d = [
"M", start.x, start.y,
"A", radius, radius, 0, largeArcFlag, 0, end.x, end.y
].join(" ");

return d;
}

var correctPath = document.getElementById('correctPath'),
incorrectPath = document.getElementById('incorrectPath'),
expectedPath = document.getElementById('expectedPath');

correctPath.setAttribute('d', describeArc(24,24,20,0,90));
incorrectPath.setAttribute('d', describeArc(24,24,20,90,0));
expectedPath.setAttribute('d', 'M24 2.75 a 1 1 1 1 1 0 42.8');
.col {width: 32%; float: left; padding: 0.5%}
<div class="col">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 48 48">
<defs>
<path d="" id="correctPath"></path>
</defs>
<circle r="24" cx="24" cy="24" fill="#eee"></circle>
<text id="nameText" fill="green" font-size="3.2">
<textPath xlink:href="#correctPath">correct</textPath>
</text>
</svg>
</div>

<div class="col">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 48 48">
<defs>
<path d="" id="incorrectPath"></path>
</defs>
<circle r="24" cx="24" cy="24" fill="#eee"></circle>
<text id="nameText" fill="red" font-size="3.2">
<textPath xlink:href="#incorrectPath">incorrect</textPath>
</text>
</svg>
</div>

<div class="col">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 48 48">
<defs>
<path d="" id="expectedPath"></path>
</defs>
<circle r="24" cx="24" cy="24" fill="#eee"></circle>
<text id="nameText" fill="blue" font-size="3.2">
<textPath xlink:href="#expectedPath">expected</textPath>
</text>
</svg>
</div>

所以使用

correctPath.setAttribute('d', describeArc(24,24,20,0,90));

它似乎做了应该做的事情,但在这种情况下,我需要将文本颠倒过来,所以我试图反转 startAngleendAngle

incorrectPath.setAttribute('d', describeArc(24,24,20,90,0));

你看到的结果是不正确的,它基本上将圆弧中心坐标重新定位到另一个位置,而不是给我我期望的坐标。

如何调整这两个函数才能处理 startAngle 的反向操作和endAngle产生预期的结果?

最佳答案

arc 命令的结构如下:

rx ry x-axis-rotation large-arc-flag sweep-flag x y

最后一个标志,sweep-flag,描述了弧绕圆的方向。如果交换极坐标中的起始 Angular 和结束 Angular ,也会交换方向:endAngle > startAngle 表示顺时针,startAngle > endAngle 表示逆时针。您的函数绘制从 endAngle 到 startAngle 的弧,因此反之亦然。

一个简单的解决方案是实现此规则:

function polarToCartesian(centerX, centerY, radius, angleInDegrees) {
var angleInRadians = (angleInDegrees-90) * Math.PI / 180.0;

return {
x: centerX + (radius * Math.cos(angleInRadians)),
y: centerY + (radius * Math.sin(angleInRadians))
};
}

function describeArc(x, y, radius, startAngle, endAngle){

var start = polarToCartesian(x, y, radius, endAngle);
var end = polarToCartesian(x, y, radius, startAngle);

var largeArcFlag = endAngle - startAngle <= 180 ? "0" : "1";
var sweepFlag = endAngle > startAngle ? 0 : 1; //sic

var d = [
"M", start.x, start.y,
"A", radius, radius, 0, largeArcFlag, sweepFlag, end.x, end.y
].join(" ");

return d;
}

var correctPath = document.getElementById('correctPath'),
incorrectPath = document.getElementById('incorrectPath'),
expectedPath = document.getElementById('expectedPath');

correctPath.setAttribute('d', describeArc(24,24,20,0,90));
incorrectPath.setAttribute('d', describeArc(24,24,20,90,0));
expectedPath.setAttribute('d', 'M24 2.75 a 1 1 1 1 1 0 42.8');
.col {width: 32%; float: left; padding: 0.5%}
<div class="col">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 48 48">
<defs>
<path d="" id="correctPath"></path>
</defs>
<circle r="24" cx="24" cy="24" fill="#eee"></circle>
<text id="nameText" fill="green" font-size="3.2">
<textPath xlink:href="#correctPath">counterclockwise</textPath>
</text>
</svg>
</div>

<div class="col">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 48 48">
<defs>
<path d="" id="incorrectPath"></path>
</defs>
<circle r="24" cx="24" cy="24" fill="#eee"></circle>
<text id="nameText" fill="red" font-size="3.2">
<textPath xlink:href="#incorrectPath">clockwise</textPath>
</text>
</svg>
</div>

<div class="col">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 48 48">
<defs>
<path d="" id="expectedPath"></path>
</defs>
<circle r="24" cx="24" cy="24" fill="#eee"></circle>
<text id="nameText" fill="blue" font-size="3.2">
<textPath xlink:href="#expectedPath">expected</textPath>
</text>
</svg>
</div>

但请注意,一旦您想要真正越过圆的末端(以度为单位),此规则就会失败。比方说,从 300 度到顺时针 90 度。如果这是您的意图,则必须明确说明并将旋转方向作为参数传递给您的函数。

(您的引用路径M24 2.75 a 1 1 1 1 1 0 42.8无法绘制并自动重写为M 24,2.75 a 21.4,21.4 1 1 1 0 42.8 code>。有关管理此替换的规则,请参阅 these notes。)

关于javascript - 绘制反转圆弧改变圆心坐标,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52056486/

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