1
This commit is contained in:
@@ -11,6 +11,32 @@ public class UnitAlgorithmBezier : UnitAlgorithm<DataPlate> {
|
||||
/// <summary> 贝塞尔算法 </summary>
|
||||
public UnitAlgorithmBezier() { }
|
||||
|
||||
public void Compute(DataPlate data) {
|
||||
List<Vector3> points = new List<Vector3>();
|
||||
for (int i = 0; i < data.plateSides.Count; i++) {
|
||||
Compute(data.plateSides[i]);
|
||||
//points.AddRange(data.plateSides[i].positions);
|
||||
}
|
||||
//去除重复边缘点
|
||||
points = points.Distinct().ToList();
|
||||
//data.edgePoints = points;
|
||||
}
|
||||
public void Compute(DataPlateSide data) {
|
||||
DataBezier dataBezier = new DataBezier();
|
||||
dataBezier.bezier = data.bezier;
|
||||
//dataBezier.smooth = data.plate.smooth;
|
||||
dataBezier.aPoint = data.aPoint.position;
|
||||
dataBezier.bPoint = data.bPoint.position;
|
||||
dataBezier.aBezier = data.aBezier;
|
||||
dataBezier.bBezier = data.bBezier;
|
||||
|
||||
dataBezier.Compute();
|
||||
|
||||
//data.length = dataBezier.length;
|
||||
//data.positions = dataBezier.positions.ToArray();
|
||||
//data.lines = dataBezier.lines.ToArray();
|
||||
}
|
||||
|
||||
public class DataBezier {
|
||||
//输入
|
||||
public float smooth;
|
||||
@@ -22,97 +48,57 @@ public class UnitAlgorithmBezier : UnitAlgorithm<DataPlate> {
|
||||
//输出
|
||||
public float length;
|
||||
public List<Vector3> positions = new List<Vector3>();
|
||||
public List<DataLine> lines = new List<DataLine>();
|
||||
}
|
||||
|
||||
public void Compute(DataPlate data) {
|
||||
List<Vector3> points = new List<Vector3>();
|
||||
for (int i = 0; i < data.sides.Count; i++) {
|
||||
Compute(data.sides[i]);
|
||||
points.AddRange(data.sides[i].positions);
|
||||
public List<DataPlateLine> lines = new List<DataPlateLine>();
|
||||
/// <summary> 计算曲线细分点 </summary>
|
||||
public void Compute() {
|
||||
//细分点
|
||||
if (bezier == Bezier.一阶) { positions = new List<Vector3> { aPoint, bPoint }; }
|
||||
if (bezier == Bezier.二阶) { positions = Compute(aPoint, aBezier, bPoint); }
|
||||
if (bezier == Bezier.三阶) { positions = Compute(aPoint, aBezier, bBezier, bPoint); }
|
||||
//线段
|
||||
lines = new List<DataPlateLine>();
|
||||
for (int i = 0; i < positions.Count - 1; i++) {
|
||||
DataPlateLine line = new DataPlateLine();
|
||||
line.a = positions.LoopIndex(i + 0);
|
||||
line.b = positions.LoopIndex(i + 1);
|
||||
line.origin = length;
|
||||
lines.Add(line);
|
||||
length += line.Distance;
|
||||
}
|
||||
}
|
||||
//去除重复边缘点
|
||||
points = points.Distinct().ToList();
|
||||
data.edgePoints = points;
|
||||
}
|
||||
public void Compute(DataSide data) {
|
||||
DataBezier dataBezier = new DataBezier();
|
||||
dataBezier.bezier = data.bezier;
|
||||
dataBezier.smooth = data.plate.smooth;
|
||||
dataBezier.aPoint = data.aPoint.position;
|
||||
dataBezier.bPoint = data.bPoint.position;
|
||||
dataBezier.aBezier = data.aBezier;
|
||||
dataBezier.bBezier = data.bBezier;
|
||||
|
||||
Compute(dataBezier);
|
||||
|
||||
data.length = dataBezier.length;
|
||||
data.positions = dataBezier.positions.ToArray();
|
||||
data.lines = dataBezier.lines.ToArray();
|
||||
}
|
||||
|
||||
/// <summary> 计算曲线细分点 </summary>
|
||||
private void Compute(DataBezier data) {
|
||||
//细分点
|
||||
if (data.bezier == Bezier.一阶) {
|
||||
data.positions = Compute(data.aPoint, data.bPoint);
|
||||
/// <summary> 二阶贝塞尔线段 </summary>
|
||||
private List<Vector3> Compute(Vector3 a, Vector3 b, Vector3 c) {
|
||||
List<Vector3> points = new List<Vector3>();
|
||||
//方向,距离
|
||||
float distance = Vector2.Distance(c, a);
|
||||
//求余,得商数
|
||||
int quotient = Quotient(distance, smooth);
|
||||
//贝塞尔曲线点
|
||||
for (int i = 0; i < quotient; i++) {
|
||||
float t = i * (distance / quotient) / distance;
|
||||
Vector2 position = ComputeBezier(a, b, c, t);
|
||||
points.Add(position);
|
||||
}
|
||||
points.Add(c);
|
||||
return points;
|
||||
}
|
||||
if (data.bezier == Bezier.二阶) {
|
||||
data.positions = Compute(data.aPoint, data.aBezier, data.bPoint, data.smooth);
|
||||
/// <summary> 三阶贝塞尔线段 </summary>
|
||||
private List<Vector3> Compute(Vector3 a, Vector3 b, Vector3 c, Vector3 d) {
|
||||
List<Vector3> points = new List<Vector3>();
|
||||
//方向,距离
|
||||
Vector2 direction = (d - a).normalized;
|
||||
float distance = Vector2.Distance(d, a);
|
||||
//求余,得商数
|
||||
int quotient = Quotient(distance, smooth);
|
||||
//贝塞尔曲线点
|
||||
for (int i = 0; i < quotient; i++) {
|
||||
float t = i * (distance / quotient) / distance;
|
||||
Vector2 position = ComputeBezier(a, b, c, d, t);
|
||||
points.Add(position);
|
||||
}
|
||||
points.Add(d);
|
||||
return points;
|
||||
}
|
||||
if (data.bezier == Bezier.三阶) {
|
||||
data.positions = Compute(data.aPoint, data.aBezier, data.bBezier, data.bPoint, data.smooth);
|
||||
}
|
||||
//线段
|
||||
data.lines = new List<DataLine>();
|
||||
float origin = 0;
|
||||
for (int i = 0; i < data.positions.Count - 1; i++) {
|
||||
DataLine line = new DataLine();
|
||||
line.a = data.positions.LoopIndex(i + 0);
|
||||
line.b = data.positions.LoopIndex(i + 1);
|
||||
line.origin = origin;
|
||||
data.lines.Add(line);
|
||||
data.length += line.Distance;
|
||||
origin += line.Distance;
|
||||
}
|
||||
}
|
||||
/// <summary> 二阶贝塞尔线段 </summary>
|
||||
private List<Vector3> Compute(Vector3 aPoint, Vector3 bPoint) {
|
||||
return new List<Vector3> { aPoint, bPoint };
|
||||
}
|
||||
/// <summary> 二阶贝塞尔线段 </summary>
|
||||
private List<Vector3> Compute(Vector3 a, Vector3 b, Vector3 c, float smooth) {
|
||||
List<Vector3> points = new List<Vector3>();
|
||||
//方向,距离
|
||||
Vector2 direction = (c - a).normalized;
|
||||
float distance = Vector2.Distance(c, a);
|
||||
//求余,得商数
|
||||
int quotient = Quotient(distance, smooth);
|
||||
//贝塞尔曲线点
|
||||
for (int i = 0; i < quotient; i++) {
|
||||
float t = i * (distance / quotient) / distance;
|
||||
Vector2 position = ComputeBezier(a, b, c, t);
|
||||
points.Add(position);
|
||||
}
|
||||
points.Add(c);
|
||||
return points;
|
||||
}
|
||||
/// <summary> 三阶贝塞尔线段 </summary>
|
||||
private List<Vector3> Compute(Vector3 a, Vector3 b, Vector3 c, Vector3 d, float smooth) {
|
||||
List<Vector3> points = new List<Vector3>();
|
||||
//方向,距离
|
||||
Vector2 direction = (d - a).normalized;
|
||||
float distance = Vector2.Distance(d, a);
|
||||
//求余,得商数
|
||||
int quotient = Quotient(distance, smooth);
|
||||
//贝塞尔曲线点
|
||||
for (int i = 0; i < quotient; i++) {
|
||||
float t = i * (distance / quotient) / distance;
|
||||
Vector2 position = ComputeBezier(a, b, c, d, t);
|
||||
points.Add(position);
|
||||
}
|
||||
points.Add(d);
|
||||
return points;
|
||||
}
|
||||
|
||||
/// <summary> 商数 </summary>
|
||||
|
||||
Reference in New Issue
Block a user