在Javascript中圆角多边形角

在Javascript中圆角多边形角,javascript,geometry,linear-algebra,trigonometry,Javascript,Geometry,Linear Algebra,Trigonometry,我想为一个角创建一个圆角,用户可以在其中指定角的半径和细分数。为了找到这些新点,我将有三个向量:p,p1,&p2,以及随后的线段:PP1和PP2。 我发现这有潜在的解决方案,但答案是C#的,我正在使用Javascript。我已经包括了我对守则的解释 var canvas=document.getElementById(“canvas”); var ctx=canvas.getContext(“2d”); var radius_slider=document.getElementById(“r

我想为一个角创建一个圆角,用户可以在其中指定角的半径和细分数。为了找到这些新点,我将有三个向量:pp1,&p2,以及随后的线段:PP1PP2

我发现这有潜在的解决方案,但答案是C#的,我正在使用Javascript。我已经包括了我对守则的解释

var canvas=document.getElementById(“canvas”);
var ctx=canvas.getContext(“2d”);
var radius_slider=document.getElementById(“radius”);
var subdivs_slider=document.getElementById(“subdivs”);
var generateBtn=document.getElementById(“生成”);
var radiusReadout=document.getElementById(“radiusReadout”);
var subdivReadout=document.getElementById(“subdivReadout”);
类点{
构造函数(x,y){
这个.x=x;
这个。y=y;
}
}
函数DrawRoundedCorner(角度点、p1、p2、半径、细分){
//向量1
dx1=角度点.x-p1.x;
dy1=角度点y-p1.y;
//向量2
dx2=角度点.x-p2.x;
dy2=角度点y-p2.y;
//向量1和向量2之间的角度除以2
角度=(数学atan2(dy1,dx1)-数学atan2(dy2,dx2))/2;
//角度点与基准点之间的线段长度
//与给定半径圆的交点
tan=Math.abs(Math.tan(角度));
分段=半径/tan;
//检查段
length1=GetLength(dx1,dy1);
length2=GetLength(dx2,dy2);
长度=数学最小值(长度1,长度2);
如果(段>长度){
段=长度;
半径=长度*tan;
}
//交点是通过以下各项之间的比例计算的:
//向量的坐标、向量的长度和线段的长度。
变量p1Cross=获取比例点(角度点、线段、长度1、dx1、dy1);
var p2Cross=获取比例点(角度点、段、长度2、dx2、dy2);
//圆坐标的计算
//通过角向量的加法来居中。
dx=角度点x*2-p1Cross.x-p2Cross.x;
dy=角度点y*2-p1Cross.y-p2Cross.y;
L=GetLength(dx,dy);
d=GetLength(段、半径);
var circlePoint=获取比例点(角度点,d,L,dx,dy);
//星形缠结与弧的端角
var startAngle=Math.atan2(p1Cross.y-circlePoint.y,p1Cross.x-circlePoint.x);
var endAngle=Math.atan2(p2Cross.y-circlePoint.y,p2Cross.x-circlePoint.x);
//扫掠角
var sweepAngle=端角-星形缠结;
//一些额外的检查
如果(扫掠角<0){
startAngle=端角;
扫掠角=-扫掠角;
}
如果(扫掠角度>数学PI)
扫描角度=Math.PI-扫描角度;
ctx.lineWidth=2;
ctx.strokeStyle='#000000';
ctx.beginPath();
ctx.moveTo(p1.x,p1.y);
ctx.lineTo(p1Cross.x,p1Cross.y);
ctx.moveTo(p2.x,p2.y);
ctx.lineTo(p2Cross.x,p2Cross.y);
ctx.lineWidth=此.lineWidth;
ctx.strokeStyle=this.color;
ctx.stroke();
var left=圆点.x-半径;
var top=圆点y-半径;
变量直径=2*半径;
var degreeFactor=数学PI*细分;
/*
ctx.beginPath();
ctx.弧(左,顶部,直径,(星形*除油器),(端角*除油器));
ctx.strokeStyle=“#00FF00”;
ctx.stroke();
ctx.strokeStyle=“#000000”;
*/
//要获取圆弧点,可以使用以下方法:
PointScont=Math.abs(扫掠角*除油因子);
符号=数学符号(扫掠角);
点数=[];
//您可以删除Math.ceil**0.5内容,并将其作为PointScont-1或其他内容。
对于(i=0;i