원래 같은 선상에없는 세 점이 있습니다. 원래이 세 점을 통해 원호를 그립니다. 그러나 크롬은 실제 원을 그린 것이 아니라 베 지어 곡선이 저렴하기 때문에 여러 개의 베 지어 곡선을 사용하여 원을 가장합니다. 크롬이 중간 남자로서 그것을하고 있다면, 왜 내가 원과 같은 베 지어를 그리지 않는 것일까? (1 점에서 중간 점, 중간 점에서 3 점으로 두 베 지어)? 그것은 훨씬 더 깔끔하고 저렴합니다 (2 개의 베지에 곡선 (Bezier Curve) 브라우저가 결정한 알려지지 않은 수에 비해). 그게 내가 붙어있는 곳이야, 어떻게? "통제 지점"은 어디에 있어야합니까? 여기원호를 모방하기 위해 3 개의 점을 통과하는 2 개의 베 지어 커브를 그립니다.
내 오래된 무승부 아크 기능입니다 자바 스크립트
drawArc = function(startPoint, thirdPoint, endPoint){
var ctx = this.ctx;
ctx.lineWidth = this.strokeWidth;
ctx.strokeStyle = this.strokeColor;
var centerObject = circleCenter(new Point(startPoint.x, startPoint.y),
new Point(thirdPoint.x, thirdPoint.y),
new Point(endPoint.x, endPoint.y));
var centerX = centerObject.x;
var centerY = centerObject.y;
var r = centerObject.r
var angle = Math.atan2(centerX-startPoint.x, centerY-startPoint.y);
// console.log(centerObject);
if (!angle){
ctx.beginPath();
ctx.moveTo(startPoint.x, startPoint.y);
ctx.lineTo(endPoint.x, endPoint.y);
} else {
if(angle > Math.PI/2) {
ctx.beginPath();
ctx.arc(centerX, centerY, r, Math.PI * 1.5-angle, Math.PI * 1.5 + angle, true);
} else {
ctx.beginPath();
ctx.arc(centerX, centerY, r, Math.PI * 1.5-angle, Math.PI * 1.5 + angle, false);
}
}
ctx.globalCompositeOperation = "source-over";
ctx.stroke();
}
var circleCenter = function(startPoint, thirdPoint, endPoint){
var dy1 = thirdPoint.y - startPoint.y;
var dx1 = thirdPoint.x - startPoint.x;
var dy2 = endPoint.y - thirdPoint.y;
var dx2 = endPoint.x - thirdPoint.x;
var aSlope = dy1/dx1;
var bSlope = dy2/dx2;
var centerX = (aSlope*bSlope*(startPoint.y - endPoint.y) + bSlope*(startPoint.x + thirdPoint.x)
- aSlope*(thirdPoint.x+endPoint.x))/(2* (bSlope-aSlope));
var centerY = -1*(centerX - (startPoint.x+thirdPoint.x)/2)/aSlope + (startPoint.y+thirdPoint.y)/2;
var r = dist(centerX, centerY, startPoint.x, startPoint.y)
return {
x: centerX,
y: centerY,
r: r
};
}
누군가가) (나() 메소드 대신에 아크 후에 bezierCurveTo 캔버스 사용 drawArc 기능을 다시 도와 드릴까요?
내 코드 예제는 여기에 있습니다 : http://codepen.io/wentin/pen/VYegqq
"베 지어 커브는 싸다": 작은 커브는 원형 아크에 비해 베 지어 커브는 * 미친 듯이 비싼 * 그릴 수 있습니다. 하나의 베 지어 세그먼트를 계산하고 그릴 필요가있을 때 동시에 여러 번 세 점을 통해 원호를 찾아 그릴 수 있습니다. Canvas2d의'arc()'명령은 내가 아는 바로는 베 지어 근사가 아닌 진정한 원호입니다. –