/// <summary> /// No Use Now /// </summary> /// <param name="cross1">交点1</param> /// <param name="cross2">交点2</param> /// <param name="center">圆心</param> /// <param name="R">半径</param> /// <returns></returns> public static Pave radPoint(Pave cross1, Pave cross2, Pave center, double R) { Pave D = new Pave((cross1.pointx + cross2.pointx) / 2, (cross1.pointy + cross2.pointy) / 2, 0); double OD = D.Dist(center); double OC = Math.Pow(R, 2) / OD; double x1 = center.pointx + OC / OD * (D.pointx - center.pointx); double y1 = center.pointy + OC / OD * (D.pointy - center.pointy); return(new Pave(x1, y1, R)); }
/// <summary> /// 按顺序返回圆的点集信息 /// </summary> /// <param name="crossPoint">交点</param> /// <param name="line">分割线</param> /// <param name="center">圆心</param> /// <param name="R">半径</param> /// <returns></returns> public static List <Pave> CircleReturn(Pave crossPoint, Line line, Pave center, double R) { var crossPoints = CrossPoints(line, center, R); List <Pave> returnPoints = new List <Pave>(); if (crossPoint.Dist(crossPoints[0]) > crossPoint.Dist(crossPoints[1])) { returnPoints.Add(crossPoints[1]); returnPoints.Add(center); returnPoints.Add(crossPoints[0]); } else { returnPoints.Add(crossPoints[0]); returnPoints.Add(center); returnPoints.Add(crossPoints[1]); } return(returnPoints); }
public Line(Pave point1, Pave point2) { this.point1 = point1; this.point2 = point2; if (point2.radius != 0) { this._type = true; if (point1.Dist(point2) > point2.radius) { } else { } } else { this._type = false; } }
public static void ReturnCommands(ref ArrayList returnCommands, bool?fang, bool?yuan, List <Pave> originPane, Pave center, double dist, double R, double distxF, double distyF, double ang, string paveRef, bool multiSplit, double splitDist, double splitCount) { double x = center.pointx; double y = center.pointy; //Line line = new Line(x, y, ang); double deltX = (dist / 2) * Math.Sin(ang); double deltY = -(dist / 2) * Math.Cos(ang); double x1 = x + deltX; double y1 = y + deltY; double x2 = x - deltX; double y2 = y - deltY; Pave pavea = new Pave(x1, y1, 0); Pave paveb = new Pave(x2, y2, 0); Line linea = new Line(x1, y1, ang); Line lineb = new Line(x2, y2, ang); GetLines.SetLine((pavea.Dist(originPane.First()) > paveb.Dist(originPane.First())), linea, lineb); bool cross = false; GetPanes.SetPane(new List <Pave>(), new List <Pave>()); Line line = GetLines.GetLine(false); List <Pave> pane = GetPanes.GetPane(false); for (int i = 0; i < originPane.Count; i++) { int ii = i + 1; if (ii == originPane.Count) { ii = 0; } Line line1 = new Line(originPane[i], originPane[ii]); cross = false; var point = line1.Cross(line, ref cross); if (cross) { pane.Add(point); if (yuan == true) { pane.AddRange(CircleReturn(point, line, center, R)); } else if (fang == true) { var returnData = SquareReturn(line, center, point, distxF, distyF, dist, ang); if (returnData[0] == point) { pane.RemoveAt(pane.Count - 1); returnData.RemoveAt(0); } pane.AddRange(returnData); } pane = GetPanes.GetPane(true); line = GetLines.GetLine(true); for (int j = i; j < originPane.Count; j++) { int jj = j + 1; if (jj == originPane.Count) { jj = 0; } cross = false; line1 = new Line(originPane[j], originPane[jj]); point = line1.Cross(line, ref cross); if (cross) { pane.Add(point); i = j; ii = jj; break; } } } pane.Add(originPane[ii]); } if (multiSplit) { if (splitCount > 1) { double splitDistAbs = Math.Abs(splitDist); double xm = center.pointx; double ym = center.pointy; double xm1; double ym1; double deltXm = (dist + splitDistAbs) * Math.Sin(ang); double deltYm = -(dist + splitDistAbs) * Math.Cos(ang); if (splitDist > 0) { xm1 = xm + deltXm; ym1 = ym + deltYm; } else { xm1 = xm - deltXm; ym1 = ym - deltYm; } Pave newCenter = new Pave(xm1, ym1, center.radius); #region 点在平面内 错误 Line linem = new Line(xm1, ym1, (ang + 45) / 180 * Math.PI); bool inPlate = true; List <Pave> pave = GetPanes.GetPane(false); for (int i = 0; i < pave.Count; i++) { int j = i + 1; if (j == pave.Count) { j = 0; } Line newLine = new Line(pave[i], pave[j]); bool crossed = false; var point = newLine.Cross(linem, ref crossed); if (crossed && point.pointx > xm1) { inPlate = !inPlate; } } List <Pave> orangePavem = new List <Pave>(); orangePavem.AddRange(GetPanes.GetPane(inPlate)); returnCommands.Add("!!SplitObject.CopyPANE('" + paveRef + "')"); foreach (var item in GetPanes.GetPane(true)) { returnCommands.Add("new pave pos E " + item.pointx + " N " + item.pointy + " Frad " + item.radius); } #endregion splitCount--; if (splitCount == 1) { multiSplit = false; } ReturnCommands(ref returnCommands, fang, yuan, orangePavem, newCenter, dist, R, distxF, distyF, ang, paveRef, multiSplit, splitDist, splitCount); //ReturnCommands(ref returnCommands, fang, yuan, GetPanes.GetPane(true), newCenter, dist, R, distxF, distyF, ang, paveRef, multiSplit, splitDist, splitCount); } } else { if (GetPanes.GetPane(false).Count != 0 && GetPanes.GetPane(true).Count != 0) { returnCommands.Add("!!SplitObject.CopyPANE('" + paveRef + "')"); foreach (var item in GetPanes.GetPane(false)) { returnCommands.Add("new pave pos E " + item.pointx + " N " + item.pointy + " Frad " + item.radius); } returnCommands.Add("!!SplitObject.CopyPANE('" + paveRef + "')"); foreach (var item in GetPanes.GetPane(true)) { returnCommands.Add("new pave pos E " + item.pointx + " N " + item.pointy + " Frad " + item.radius); } } } returnCommands.Add("PANE"); }
/// <summary> /// 按顺序返回方孔信息 /// </summary> /// <param name="line">分割线</param> /// <param name="center">圆心</param> /// <param name="cross">交点</param> /// <param name="distxF">沿直线方向长度</param> /// <param name="distyF">垂直直线方向长度</param> /// <param name="dist">分割距离</param> /// <param name="ang">角度</param> /// <returns></returns> public static List <Pave> SquareReturn(Line line, Pave center, Pave cross, double distxF, double distyF, double dist, double ang) { List <Pave> returnPoints = new List <Pave>(); double xF = line.point1.pointx; double yF = line.point1.pointy; double deltXF = (distxF / 2) * Math.Cos(ang); double deltYF = (distxF / 2) * Math.Sin(ang); double x1F = xF + deltXF; double y1F = yF + deltYF; double x2F = xF - deltXF; double y2F = yF - deltYF; Pave paveaF = new Pave(x1F, y1F, 0); Pave pavebF = new Pave(x2F, y2F, 0); Pave paveF1; if (cross.Dist(line.point1) <= distxF / 2) { paveF1 = cross; distxF = distxF / 2 + cross.Dist(line.point1); } else { //MessageBox.Show(cross.Dist(line.point1).ToString() + " " + (distxF / 2).ToString()); if (paveaF.Dist(cross) < pavebF.Dist(cross)) { paveF1 = paveaF; } else { paveF1 = pavebF; } } xF = paveF1.pointx; yF = paveF1.pointy; deltXF = (distyF - dist) / 2 * Math.Sin(ang); deltYF = -(distyF - dist) / 2 * Math.Cos(ang); x1F = xF + deltXF; y1F = yF + deltYF; x2F = xF - deltXF; y2F = yF - deltYF; paveaF = new Pave(x1F, y1F, 0); pavebF = new Pave(x2F, y2F, 0); Pave paveF2; if (paveaF.Dist(center) > pavebF.Dist(center)) { paveF2 = paveaF; } else { paveF2 = pavebF; } xF = paveF2.pointx; yF = paveF2.pointy; deltXF = (distxF) * Math.Cos(ang); deltYF = (distxF) * Math.Sin(ang); x1F = xF + deltXF; y1F = yF + deltYF; x2F = xF - deltXF; y2F = yF - deltYF; paveaF = new Pave(x1F, y1F, 0); pavebF = new Pave(x2F, y2F, 0); Pave paveF3; //if (paveF1 == cross) //{ // if (paveaF.Dist(center) > pavebF.Dist(center)) // { // paveF3 = paveaF; // } // else // { // paveF3 = pavebF; // } //} //else { if (paveaF.Dist(center) < pavebF.Dist(center)) { paveF3 = paveaF; } else { paveF3 = pavebF; } } xF = paveF3.pointx; yF = paveF3.pointy; deltXF = ((distyF - dist) / 2) * Math.Sin(ang); deltYF = -((distyF - dist) / 2) * Math.Cos(ang); x1F = xF + deltXF; y1F = yF + deltYF; x2F = xF - deltXF; y2F = yF - deltYF; paveaF = new Pave(x1F, y1F, 0); pavebF = new Pave(x2F, y2F, 0); Pave paveF4; if (paveaF.Dist(center) < pavebF.Dist(center)) { paveF4 = paveaF; } else { paveF4 = pavebF; } returnPoints.Add(paveF1); returnPoints.Add(paveF2); returnPoints.Add(paveF3); returnPoints.Add(paveF4); return(returnPoints); }