如何画画。javascript中的弧?

如何画画。javascript中的弧?,javascript,Javascript,如何在javascript中实现圆角 以下是C#中绘制圆角的代码 有些几何体带有油漆: 0你有一个角落: ![角落][1] 1.您知道角点的坐标,设为P1、P2和P: ![转角点][2] 2.现在您可以从点和向量之间的角度获取向量: ![矢量和角度][3] 如果扫掠角度180? 扫掠角度=180-扫掠角度 11现在可以画一个圆角: ![结果][11] 一些带有c#的几何体: private void DrawRoundedCorner(图形、点F角点、, 点F p1、点F p2、浮动

如何在javascript中实现圆角

以下是C#中绘制圆角的代码

有些几何体带有油漆:
0你有一个角落:
![角落][1]

1.您知道角点的坐标,设为P1、P2和P:
![转角点][2]

2.现在您可以从点和向量之间的角度获取向量:
![矢量和角度][3]

如果扫掠角度<0,则交换起始角和结束角,并反转扫掠角度:

扫掠角度<0?
扫描角度=-扫描角度
startAngle=端角
检查扫掠角度是否>180度:

扫掠角度>180?
扫掠角度=180-扫掠角度

11现在可以画一个圆角:
![结果][11]
一些带有c#的几何体:
private void DrawRoundedCorner(图形、点F角点、,
点F p1、点F 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;
//检查段
双长度1=GetLength(dx1,dy1);
双长度2=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-扫描角度;
//使用图形绘制结果
var笔=新笔(颜色为黑色);
图形。清晰(颜色。白色);
graphics.SmoothingMode=SmoothingMode.AntiAlias;
绘图线(钢笔、p1、p1十字);
图形。抽绳(钢笔、p2、p2十字);
var left=圆点.X-半径;
var top=圆点Y-半径;
变量直径=2*半径;
var degreeFactor=180/Math.PI;
绘图弧(笔、左、上、直径、直径、,
(浮子)(startAngle*脱脂剂),
(浮动)(扫掠角*除油器);
}
专用双GetLength(双dx,双dy)
{
返回Math.Sqrt(dx*dx+dy*dy);
}
私有点F获取比例点(点F点,双段,
双长度,双dx,双dy)
{
双因素=段/长度;
返回新的点F((浮点)(点X-dx*因子),
(浮动)(点Y-dy*系数);
}
要获取弧点,可以使用以下命令:

//每度一分。但在某些情况下,这是必要的
//使用更多的点。只要换一个脱脂剂就行了。
int pointscont=(int)Math.Abs(扫掠角*除油因子);
int符号=数学符号(扫掠角);
PointF[]点=新的PointF[pointsCount];
对于(int i=0;i
我已经实现了这是javascript:

让半径=10;
恒定角=
Math.atan(p.x-p1.x,p.x-p1.x)-Math.atan(p.y-p2.y,p.x-p2.x);
让线段=半径/数学绝对值(数学tan(角度/2));
constpp1=Math.sqrt(Math.pow(p.x-p1.x,2)+Math.pow(p.y-p1.y,2));
constpp2=Math.sqrt(Math.pow(p.x-p2.x,2)+Math.pow(p.y-p2.y,2));
const min=数学min(第1页,第2页);
如果(段>分钟){
段=分钟;
半径=段*数学绝对值(数学tan(角度/2));
}
常数po=Math.sqrt(Math.pow(半径,2)+Math.pow(段,2));
常数r=10;
常数c1x=p.x-((p.x-p1.x)*段)/pp1;
常数c1y=p.y-((p.y-p1.y)*段)/pp1;
常数c2x=p.x-((p.x-p2.x)*段)/pp2;
常数c2y=p.y-((p.y-p2.y)*段)/pp2;
常数dx=p.x*2-c1x-c2x;
常数dy=p.y*2-c1y-c2y;
constpc=Math.sqrt(Math.pow(dx,2)+Math.pow(dy,2));
const ox=p.x-(dx*po)/pc;
const oy=p.y-(dy*po)/pc;
设startAngle=Math.atan((c1y-oy)/(c1x-ox));
设endAngle=Math.atan((c2y-oy)/(c2x-ox));
让sweepAngle=endAngle-startAngle;
如果(扫掠角<0){
扫掠角=-扫掠角;
startAngle=端角;
}
如果(扫掠角度>180)扫掠角度=180-扫掠角度;
但问题是圆角并没有按预期绘制

Th angle = atan(PY - P1Y, PX - P1X) - atan(PY - P2Y, PX - P2X) segment = PC1 = PC2 = radius / |tan(angle / 2)| PP1 = sqrt((PX - P1X)2 + (PY - P1Y)2) PP2 = sqrt((PX - P2X)2 + (PY - P2Y)2) min = Min(PP1, PP2) (for polygon is better to divide this value by 2) segment > min ? segment = min radius = segment * |tan(angle / 2)| PO = sqrt(radius2 + segment2) (PX - C1X) / (PX - P1X) = PC1 / PP1 C1X = PX - (PX - P1X) * PC1 / PP1 C1Y = PY - (PY - P1Y) * PC1 / PP1 C2X = PX - (PX - P2X) * PC2 / PP2 C2Y = PY - (PY - P2Y) * PC2 / PP2 (PX - OX) / (PX - CX) = PO / PC (PY - OY) / (PY - CY) = PO / PC CX = C1X + C2X - PX CY = C1Y + C2Y - PY PC = sqrt((PX - CX)2 + (PY - CY)2) dx = PX - CX = PX * 2 - C1X - C2X dy = PY - CY = PY * 2 - C1Y - C2Y PC = sqrt(dx2 + dy2) OX = PX - dx * PO / PC OY = PY - dy * PO / PC startAngle = atan((C1Y - OY) / (C1X - OX)) endAngle = atan((C2Y - OY) / (C2X - OX))