|
|
|
@ -1,9 +1,9 @@
|
|
|
|
|
import * as THREE from 'three';
|
|
|
|
|
import { Box3, Matrix4, Object3D, ShapeGeometry, Vector2, Vector3 } from 'three';
|
|
|
|
|
import { arraySortByNumber } from '../Common/ArrayExt';
|
|
|
|
|
import { ColorMaterial } from '../Common/ColorPalette';
|
|
|
|
|
import { Vec2DTo3D, getCircleCenter } from '../Common/CurveUtils';
|
|
|
|
|
import { angle, angleTo2Pi, equaln, midPoint, polar, equal } from '../Geometry/GeUtils';
|
|
|
|
|
import { matrixSetVector } from '../Common/Matrix4Utils';
|
|
|
|
|
import { angle, angleTo2Pi, equal, equaln, midPoint, polar } from '../Geometry/GeUtils';
|
|
|
|
|
import { RenderType } from '../GraphicsSystem/Enum';
|
|
|
|
|
import { IntersectArcAndArc, IntersectCircleAndArc, IntersectLineAndArc, IntersectOption, IntersectPolylineAndCurve, reverseIntersectOption } from '../GraphicsSystem/IntersectWith';
|
|
|
|
|
import { Factory } from './CADFactory';
|
|
|
|
@ -31,18 +31,15 @@ export class Arc extends Curve
|
|
|
|
|
constructor(center?: Vector3, radius?: number, startAngle?: number, endAngle?: number, normal?: Vector3)
|
|
|
|
|
{
|
|
|
|
|
super();
|
|
|
|
|
center && this.m_Center.copy(center);
|
|
|
|
|
normal && this.m_Normal.copy(normal);
|
|
|
|
|
center && this.m_Matrix.setPosition(center);
|
|
|
|
|
normal && matrixSetVector(this.m_Matrix, 2, normal);
|
|
|
|
|
this.m_Radius = radius || 0;
|
|
|
|
|
if (startAngle) this.m_StartAngle = angleTo2Pi(startAngle);
|
|
|
|
|
if (endAngle) this.m_EndAngle = angleTo2Pi(endAngle);
|
|
|
|
|
}
|
|
|
|
|
private m_Center = new Vector3(0, 0, 0);
|
|
|
|
|
private m_Radius: number = 0;
|
|
|
|
|
private m_StartAngle: number = 0;
|
|
|
|
|
private m_EndAngle: number = 0;
|
|
|
|
|
private m_Normal = new Vector3(0, 0, 1);
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* 曲线为顺时针
|
|
|
|
|
*
|
|
|
|
@ -53,23 +50,23 @@ export class Arc extends Curve
|
|
|
|
|
|
|
|
|
|
get Center()
|
|
|
|
|
{
|
|
|
|
|
return this.m_Center.clone();
|
|
|
|
|
return new Vector3().setFromMatrixPosition(this.m_Matrix);
|
|
|
|
|
}
|
|
|
|
|
set Center(v: Vector3)
|
|
|
|
|
{
|
|
|
|
|
this.WriteAllObjectRecord();
|
|
|
|
|
this.m_Center.copy(v);
|
|
|
|
|
this.m_Matrix.setPosition(v);
|
|
|
|
|
this.Update();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
get Normal()
|
|
|
|
|
{
|
|
|
|
|
return this.m_Normal.clone();
|
|
|
|
|
return new Vector3().setFromMatrixColumn(this.m_Matrix, 2);
|
|
|
|
|
}
|
|
|
|
|
set Normal(v: Vector3)
|
|
|
|
|
{
|
|
|
|
|
this.WriteAllObjectRecord();
|
|
|
|
|
this.m_Normal.copy(v);
|
|
|
|
|
matrixSetVector(this.m_Matrix, 2, v);
|
|
|
|
|
this.Update();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
@ -148,19 +145,21 @@ export class Arc extends Curve
|
|
|
|
|
//******************** Curve function start*****************//
|
|
|
|
|
get StartPoint()
|
|
|
|
|
{
|
|
|
|
|
return polar(this.Center, this.StartAngle, this.m_Radius) as Vector3;
|
|
|
|
|
return polar(new Vector3(), this.m_StartAngle, this.m_Radius).applyMatrix4(this.OCS);
|
|
|
|
|
}
|
|
|
|
|
set StartPoint(v: Vector3)
|
|
|
|
|
{
|
|
|
|
|
this.StartAngle = angle(v.clone().sub(this.m_Center));
|
|
|
|
|
let vTemp = v.clone().applyMatrix4(this.OCSInv);
|
|
|
|
|
this.StartAngle = angle(vTemp);
|
|
|
|
|
}
|
|
|
|
|
get EndPoint()
|
|
|
|
|
{
|
|
|
|
|
return polar(this.Center, this.m_EndAngle, this.m_Radius) as Vector3;
|
|
|
|
|
return polar(new Vector3(), this.m_EndAngle, this.m_Radius).applyMatrix4(this.OCS);
|
|
|
|
|
}
|
|
|
|
|
set EndPoint(v: Vector3)
|
|
|
|
|
{
|
|
|
|
|
this.EndAngle = angle(v.clone().sub(this.m_Center));
|
|
|
|
|
let vTemp = v.clone().applyMatrix4(this.OCSInv);
|
|
|
|
|
this.EndAngle = angle(vTemp);
|
|
|
|
|
}
|
|
|
|
|
get StartParam()
|
|
|
|
|
{
|
|
|
|
@ -177,7 +176,7 @@ export class Arc extends Curve
|
|
|
|
|
GetPointAtParam(param: number)
|
|
|
|
|
{
|
|
|
|
|
let an = this.GetAngleAtParam(param);
|
|
|
|
|
return polar(this.Center, an, this.m_Radius) as Vector3;
|
|
|
|
|
return polar(new Vector3(), an, this.m_Radius).applyMatrix4(this.OCS);
|
|
|
|
|
}
|
|
|
|
|
GetPointAtDistance(distance: number)
|
|
|
|
|
{
|
|
|
|
@ -201,10 +200,12 @@ export class Arc extends Curve
|
|
|
|
|
{
|
|
|
|
|
if (this.m_Radius == 0 ||
|
|
|
|
|
this.AllAngle == 0 ||
|
|
|
|
|
!equaln(pt.distanceToSquared(this.m_Center), this.m_Radius * this.m_Radius, 1e-6))
|
|
|
|
|
!equaln(pt.distanceToSquared(this.Center), this.m_Radius * this.m_Radius, 1e-6))
|
|
|
|
|
return NaN;
|
|
|
|
|
|
|
|
|
|
let ptTmp = pt.clone().applyMatrix4(this.OCSInv);
|
|
|
|
|
//角度
|
|
|
|
|
let an = angle(pt.clone().sub(this.m_Center));
|
|
|
|
|
let an = angle(ptTmp);
|
|
|
|
|
return this.GetParamAtAngle(an);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
@ -236,7 +237,6 @@ export class Arc extends Curve
|
|
|
|
|
|
|
|
|
|
GetAngleAtParam(param: number)
|
|
|
|
|
{
|
|
|
|
|
|
|
|
|
|
return angleTo2Pi(this.m_StartAngle + param * this.AllAngle * (this.m_Clockwise ? -1 : 1));
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
@ -286,7 +286,7 @@ export class Arc extends Curve
|
|
|
|
|
if (cu instanceof Arc)
|
|
|
|
|
{
|
|
|
|
|
this.WriteAllObjectRecord();
|
|
|
|
|
if (equal(cu.Center, this.m_Center) && equaln(cu.m_Radius, this.m_Radius))
|
|
|
|
|
if (equal(cu.Center, this.Center) && equaln(cu.m_Radius, this.m_Radius))
|
|
|
|
|
{
|
|
|
|
|
let [sa, ea] = [cu.StartAngle, cu.EndAngle];
|
|
|
|
|
if (cu.m_Clockwise != this.m_Clockwise)
|
|
|
|
@ -453,6 +453,10 @@ export class Arc extends Curve
|
|
|
|
|
if (p2 instanceof Vector2)
|
|
|
|
|
p2 = Vec2DTo3D(p2);
|
|
|
|
|
|
|
|
|
|
let ocsInv = this.OCSInv;
|
|
|
|
|
p1 = p1.clone().applyMatrix4(ocsInv);
|
|
|
|
|
p2 = p2.clone().applyMatrix4(ocsInv);
|
|
|
|
|
|
|
|
|
|
//弦向量
|
|
|
|
|
let chordV = p2.clone().sub(p1);
|
|
|
|
|
//弦角度
|
|
|
|
@ -469,13 +473,14 @@ export class Arc extends Curve
|
|
|
|
|
let toCenterAn = chordAn + Math.PI * 0.5;//弦角度转90
|
|
|
|
|
|
|
|
|
|
//圆心
|
|
|
|
|
this.m_Center = midPoint(p1, p2);
|
|
|
|
|
polar(this.m_Center, toCenterAn, this.m_Radius - (bul * chordLengthHalf));
|
|
|
|
|
let center = midPoint(p1, p2);
|
|
|
|
|
polar(center, toCenterAn, this.m_Radius - (bul * chordLengthHalf));
|
|
|
|
|
this.Center = center.clone().applyMatrix4(this.OCS);
|
|
|
|
|
|
|
|
|
|
this.m_Radius = Math.abs(this.m_Radius);
|
|
|
|
|
|
|
|
|
|
this.m_StartAngle = angle(p1.clone().sub(this.m_Center));
|
|
|
|
|
this.m_EndAngle = angle(p2.clone().sub(this.m_Center));
|
|
|
|
|
this.m_StartAngle = angle(p1.clone().sub(center));
|
|
|
|
|
this.m_EndAngle = angle(p2.clone().sub(center));
|
|
|
|
|
|
|
|
|
|
this.m_Clockwise = bul < 0;
|
|
|
|
|
|
|
|
|
@ -486,12 +491,19 @@ export class Arc extends Curve
|
|
|
|
|
{
|
|
|
|
|
if (!(pt1 && pt2 && pt3))
|
|
|
|
|
return;
|
|
|
|
|
this.m_Center = getCircleCenter(pt1, pt2, pt3);
|
|
|
|
|
|
|
|
|
|
let ocsInv = this.OCSInv;
|
|
|
|
|
pt1 = pt1.clone().applyMatrix4(ocsInv);
|
|
|
|
|
pt2 = pt2.clone().applyMatrix4(ocsInv);
|
|
|
|
|
pt3 = pt3.clone().applyMatrix4(ocsInv);
|
|
|
|
|
|
|
|
|
|
let center = getCircleCenter(pt1, pt2, pt3);
|
|
|
|
|
this.Center = center.clone().applyMatrix4(this.OCS);
|
|
|
|
|
//用圆心和其中一个点求距离得到半径:
|
|
|
|
|
this.m_Radius = this.m_Center.distanceTo(pt1);
|
|
|
|
|
this.m_Radius = center.distanceTo(pt1);
|
|
|
|
|
//起始角度 端点角度
|
|
|
|
|
this.m_StartAngle = angle(pt1.clone().sub(this.Center));
|
|
|
|
|
this.m_EndAngle = angle(pt3.clone().sub(this.Center));
|
|
|
|
|
this.m_StartAngle = angle(pt1.clone().sub(center));
|
|
|
|
|
this.m_EndAngle = angle(pt3.clone().sub(center));
|
|
|
|
|
//求出向量p1->p2,p1->p3
|
|
|
|
|
let p1 = pt2.clone().sub(pt1);
|
|
|
|
|
let p2 = pt3.clone().sub(pt1);
|
|
|
|
@ -518,7 +530,7 @@ export class Arc extends Curve
|
|
|
|
|
private UpdateGeometry(geo: THREE.Geometry)
|
|
|
|
|
{
|
|
|
|
|
let shape = new THREE.Shape();
|
|
|
|
|
shape.absarc(this.m_Center.x, this.m_Center.y, this.m_Radius, this.m_StartAngle, this.m_EndAngle, this.m_Clockwise);
|
|
|
|
|
shape.absarc(0, 0, this.m_Radius, this.m_StartAngle, this.m_EndAngle, this.m_Clockwise);
|
|
|
|
|
geo.setFromPoints(shape.getPoints(60));
|
|
|
|
|
geo.verticesNeedUpdate = true;
|
|
|
|
|
}
|
|
|
|
@ -538,8 +550,6 @@ export class Arc extends Curve
|
|
|
|
|
ApplyMatrix(m: Matrix4)
|
|
|
|
|
{
|
|
|
|
|
super.ApplyMatrix(m);
|
|
|
|
|
this.m_Normal.applyMatrix4(m);
|
|
|
|
|
this.m_Center.applyMatrix4(m);
|
|
|
|
|
this.Update();
|
|
|
|
|
}
|
|
|
|
|
GetSnapPoints(): Array<THREE.Vector3>
|
|
|
|
@ -552,7 +562,7 @@ export class Arc extends Curve
|
|
|
|
|
this.StartPoint,
|
|
|
|
|
this.GetPointAtParam(0.5),
|
|
|
|
|
this.EndPoint,
|
|
|
|
|
this.m_Center.clone(),
|
|
|
|
|
this.Center.clone(),
|
|
|
|
|
]
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
@ -568,7 +578,7 @@ export class Arc extends Curve
|
|
|
|
|
p.add(vec);
|
|
|
|
|
if (index > 2)
|
|
|
|
|
{
|
|
|
|
|
this.m_Center = this.m_Center.add(vec);
|
|
|
|
|
this.Center = this.Center.add(vec);
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
@ -587,11 +597,9 @@ export class Arc extends Curve
|
|
|
|
|
{
|
|
|
|
|
let an: number;
|
|
|
|
|
if (typeof pt === "number")
|
|
|
|
|
{
|
|
|
|
|
an = this.GetAngleAtParam(pt);
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
an = angle(pt.sub(this.m_Center));
|
|
|
|
|
an = angle(pt.clone().applyMatrix4(this.OCSInv));
|
|
|
|
|
|
|
|
|
|
an += Math.PI * 0.5 * (this.m_Clockwise ? -1 : 1);
|
|
|
|
|
return polar(new Vector3(), an, this.m_Radius) as Vector3;
|
|
|
|
@ -612,8 +620,11 @@ export class Arc extends Curve
|
|
|
|
|
{
|
|
|
|
|
super.ReadFile(file);
|
|
|
|
|
let ver = file.Read();
|
|
|
|
|
this.m_Center.fromArray(file.Read());
|
|
|
|
|
this.m_Normal.fromArray(file.Read());
|
|
|
|
|
if (ver === 1)
|
|
|
|
|
{
|
|
|
|
|
this.Center = new Vector3().fromArray(file.Read());
|
|
|
|
|
this.Normal = new Vector3().fromArray(file.Read());
|
|
|
|
|
}
|
|
|
|
|
this.m_Radius = file.Read();
|
|
|
|
|
this.m_StartAngle = file.Read();
|
|
|
|
|
this.m_EndAngle = file.Read();
|
|
|
|
@ -623,9 +634,7 @@ export class Arc extends Curve
|
|
|
|
|
WriteFile(file: CADFile)
|
|
|
|
|
{
|
|
|
|
|
super.WriteFile(file);
|
|
|
|
|
file.Write(1);
|
|
|
|
|
file.Write(this.m_Center.toArray());
|
|
|
|
|
file.Write(this.m_Normal.toArray());
|
|
|
|
|
file.Write(2);
|
|
|
|
|
file.Write(this.m_Radius);
|
|
|
|
|
file.Write(this.m_StartAngle);
|
|
|
|
|
file.Write(this.m_EndAngle);
|
|
|
|
|