public static void ForEachSegs( CadVertex cp, CadVertex pa, CadVertex pb, int splitCnt, Action <CadVertex, CadVertex> action) { CadVertex va = pa - cp; CadVertex vb = pb - cp; if (va.Norm() < 0.01) { return; } double dt = (2.0 * Math.PI) / (double)splitCnt; int div = splitCnt; Vector3d normal = CadMath.Normal(va.vector, vb.vector); CadQuaternion q = CadQuaternion.RotateQuaternion(normal, dt); CadQuaternion r = q.Conjugate(); CadVertex p = va; CadVertex tp1 = pa; CadVertex tp2 = pa; int i = 0; for (; i < div - 1; i++) { CadQuaternion qp = CadQuaternion.FromPoint(p.vector); qp = r * qp; qp = qp * q; p.vector = qp.ToPoint(); tp2 = p + cp; action(tp1, tp2); tp1 = tp2; } action(tp1, pa); }
public static void Draw( CadVertex cp, CadVertex pa, CadVertex pb, int splitCnt, DrawContext dc, DrawPen pen) { CadVertex va = pa - cp; CadVertex vb = pb - cp; if (va.Norm() < 0.01) { return; } double dt = (2.0 * Math.PI) / (double)splitCnt; int div = splitCnt; Vector3d normal = CadMath.Normal(va.vector, vb.vector); CadQuaternion q = CadQuaternion.RotateQuaternion(normal, dt); CadQuaternion r = q.Conjugate(); CadVertex p = va; CadVertex tp1 = pa; CadVertex tp2 = pa; int i = 0; for (; i < div - 1; i++) { CadQuaternion qp = CadQuaternion.FromPoint(p.vector); qp = r * qp; qp = qp * q; p.vector = qp.ToPoint(); tp2 = p + cp; dc.Drawing.DrawLine(pen, tp1.vector, tp2.vector); tp1 = tp2; } dc.Drawing.DrawLine(pen, tp1.vector, pa.vector); }
public void Rotate(CadQuaternion q, CadQuaternion r) { CadQuaternion qp; qp = CadQuaternion.FromPoint(p0.vector); qp = r * qp; qp = qp * q; p0.vector = CadQuaternion.ToPoint(qp); qp = CadQuaternion.FromPoint(p1.vector); qp = r * qp; qp = qp * q; p1.vector = CadQuaternion.ToPoint(qp); qp = CadQuaternion.FromPoint(p2.vector); qp = r * qp; qp = qp * q; p2.vector = CadQuaternion.ToPoint(qp); qp = CadQuaternion.FromPoint(p3.vector); qp = r * qp; qp = qp * q; p3.vector = CadQuaternion.ToPoint(qp); qp = CadQuaternion.FromPoint(p4.vector); qp = r * qp; qp = qp * q; p4.vector = CadQuaternion.ToPoint(qp); }
public override void MoveSelectedPointsFromStored(DrawContext dc, Vector3d delta) { CadVertex cp = StoreList[0]; if (cp.Selected) { mPointList[0] = cp + delta; mPointList[1] = StoreList[1] + delta; mPointList[2] = StoreList[2] + delta; mPointList[3] = StoreList[3] + delta; mPointList[4] = StoreList[4] + delta; return; } StackArray <CadVertex> vt = default; vt[0] = StoreList[1] - cp; vt[1] = StoreList[2] - cp; vt[2] = StoreList[3] - cp; vt[3] = StoreList[4] - cp; vt.Length = 4; if (vt[0].Norm() < 0.01) { return; } int ai = -1; for (int i = 0; i < 4; i++) { if (StoreList[i + 1].Selected) { ai = i; break; } } if (ai < 0) { return; } int bi = (ai + 1) % 4; int ci = (ai + 2) % 4; int di = (ai + 3) % 4; Vector3d normal = CadMath.CrossProduct(vt[ai].vector, vt[bi].vector); normal = normal.UnitVector(); vt[ai] += delta; CadVertex uva = vt[ai].UnitVector(); CadVertex uvb = vt[bi].UnitVector(); if (!uva.EqualsThreshold(uvb)) { normal = CadMath.CrossProduct(vt[ai].vector, vt[bi].vector); if (normal.IsZero()) { return; } normal = normal.UnitVector(); } CadQuaternion q = CadQuaternion.RotateQuaternion(normal, Math.PI / 2.0); CadQuaternion r = q.Conjugate(); CadQuaternion qp = CadQuaternion.FromPoint(vt[ai].vector); qp = r * qp; qp = qp * q; vt[bi] = (CadVertex)qp.ToPoint(); vt[ci] = -vt[ai]; vt[di] = -vt[bi]; CadVertex tmp; for (int i = 0; i < vt.Length; i++) { tmp = vt[i]; tmp.Selected = false; vt[i] = tmp; } tmp = vt[ai]; tmp.Selected = true; vt[ai] = tmp; mPointList[1] = vt[0] + cp; mPointList[2] = vt[1] + cp; mPointList[3] = vt[2] + cp; mPointList[4] = vt[3] + cp; }