public static bool TryCreateFromVertices(double x1, double y1, double bulge, double x2, double y2, out DxfArc arc) { // To the best of my knowledge, 3D Arcs are not defined via z but a normal vector. // Thus, simply ignore non-zero z values. if (Math.Abs(bulge) < 1e-10) { //throw new ArgumentException("arc bulge too small: " + bulge); arc = null; return(false); } var deltaX = x2 - x1; var deltaY = y2 - y1; var deltaLength = Math.Sqrt(deltaX * deltaX + deltaY * deltaY); if (deltaLength < 1e-10) { //throw new ArgumentException("arc startpoint == endpoint"); arc = null; return(false); } var alpha = 4.0 * Math.Atan(bulge); var radius = deltaLength / (2.0 * Math.Abs(Math.Sin(alpha * 0.5))); var deltaNormX = deltaX / deltaLength; var deltaNormY = deltaY / deltaLength; int bulgeSign = Math.Sign(bulge); // 2D only solution (z=0) var normalX = -deltaNormY * bulgeSign; var normalY = +deltaNormX * bulgeSign; var centerX = (x1 + x2) * 0.5 + normalX * Math.Cos(alpha * 0.5) * radius; var centerY = (y1 + y2) * 0.5 + normalY * Math.Cos(alpha * 0.5) * radius; // bulge<0 indicates CW arc, but DxfArc is CCW always double startAngleDeg; double endAngleDeg; if (bulge > 0) { startAngleDeg = NormalizedAngleDegree(x1, y1, centerX, centerY); endAngleDeg = NormalizedAngleDegree(x2, y2, centerX, centerY); } else { endAngleDeg = NormalizedAngleDegree(x1, y1, centerX, centerY); startAngleDeg = NormalizedAngleDegree(x2, y2, centerX, centerY); } arc = new DxfArc(new DxfPoint(centerX, centerY, 0), radius, startAngleDeg, endAngleDeg); return(true); }
public static bool TryCreateFromVertices(DxfVertex v1, DxfVertex v2, out DxfArc arc) { // To the best of my knowledge, 3D Arcs are not defined via z but a normal vector. // Thus, simply ignore non-zero z values. var bulge = v1.Bulge; if (Math.Abs(bulge) < 1e-10) { //throw new ArgumentException("arc bulge too small: " + bulge); arc = null; return(false); } var startPoint = v1.Location; var endPoint = v2.Location; var delta = endPoint - startPoint; var length = delta.Length; if (length <= double.Epsilon) { //throw new ArgumentException("arc startpoint == endpoint"); arc = null; return(false); } var alpha = 4.0 * Math.Atan(bulge); var radius = length / (2.0 * Math.Abs(Math.Sin(alpha * 0.5))); var deltaNorm = delta.Normalize(); int bulgeSign = Math.Sign(bulge); // 2D only solution (z=0) var normal = new DxfVector(-deltaNorm.Y, +deltaNorm.X, 0.0) * bulgeSign; var center = (startPoint + endPoint) * 0.5 + normal * Math.Cos(alpha * 0.5) * radius; // bulge<0 indicates CW arc, but DxfArc is CCW always double startAngleDeg; double endAngleDeg; if (bulge > 0) { startAngleDeg = NormalizedAngleDegree(startPoint, center); endAngleDeg = NormalizedAngleDegree(endPoint, center); } else { endAngleDeg = NormalizedAngleDegree(startPoint, center); startAngleDeg = NormalizedAngleDegree(endPoint, center); } arc = new DxfArc(center, radius, startAngleDeg, endAngleDeg); return(true); }
public static bool ContainsAngle(this DxfArc arc, double angle) { var start = arc.StartAngle; var end = arc.EndAngle; // normalize angles such that start is always less than end if (start > end) { // arcs specify angles in degrees start -= 360.0; } return(start <= angle && end >= angle); }
public static bool ContainsAngle(this DxfArc arc, double angle) { // normalize all angles var start = NormalizeAngleDegree(arc.StartAngle); var end = NormalizeAngleDegree(arc.EndAngle); angle = NormalizeAngleDegree(angle); // simple case: CCW arc from small to large angle. if (start <= end) { return(start <= angle && angle <= end); } // if end < start consider two areas return((start <= angle && angle < 360) || // start ccw ... 360° (0 <= angle && angle <= end)); // overflow: 0° ... end }
private static bool TryGetArcBoundingBox(DxfVertex v1, DxfVertex v2, out DxfBoundingBox bbox) { if (!DxfArc.TryCreateFromVertices(v1, v2, out var arc)) { bbox = default(DxfBoundingBox); return(false); } var boundingBox = arc.GetBoundingBox(); if (!boundingBox.HasValue) { bbox = default(DxfBoundingBox); return(false); } bbox = boundingBox.Value; return(true); }
public static bool TryCreateFromVertices(DxfLwPolylineVertex v1, DxfLwPolylineVertex v2, out DxfArc arc) { return(TryCreateFromVertices(v1.X, v1.Y, v1.Bulge, v2.X, v2.Y, out arc)); }
public static bool TryCreateFromVertices(DxfVertex v1, DxfVertex v2, out DxfArc arc) { return(TryCreateFromVertices(v1.Location.X, v1.Location.Y, v1.Bulge, v2.Location.X, v2.Location.Y, out arc)); }
internal static DxfEntity FromBuffer(DxfCodePairBufferReader buffer) { var first = buffer.Peek(); buffer.Advance(); DxfEntity entity; switch (first.StringValue) { case "3DFACE": entity = new Dxf3DFace(); break; case "3DSOLID": entity = new Dxf3DSolid(); break; case "ACAD_PROXY_ENTITY": entity = new DxfProxyEntity(); break; case "ARC": entity = new DxfArc(); break; case "ARCALIGNEDTEXT": entity = new DxfArcAlignedText(); break; case "ATTDEF": entity = new DxfAttributeDefinition(); break; case "ATTRIB": entity = new DxfAttribute(); break; case "BODY": entity = new DxfBody(); break; case "CIRCLE": entity = new DxfCircle(); break; case "DIMENSION": entity = new DxfDimensionBase(); break; case "ELLIPSE": entity = new DxfEllipse(); break; case "HELIX": entity = new DxfHelix(); break; case "IMAGE": entity = new DxfImage(); break; case "INSERT": entity = new DxfInsert(); break; case "LEADER": entity = new DxfLeader(); break; case "LIGHT": entity = new DxfLight(); break; case "LINE": case "3DLINE": entity = new DxfLine(); break; case "LWPOLYLINE": entity = new DxfLwPolyline(); break; case "MLINE": entity = new DxfMLine(); break; case "MTEXT": entity = new DxfMText(); break; case "OLEFRAME": entity = new DxfOleFrame(); break; case "OLE2FRAME": entity = new DxfOle2Frame(); break; case "POINT": entity = new DxfModelPoint(); break; case "POLYLINE": entity = new DxfPolyline(); break; case "RAY": entity = new DxfRay(); break; case "REGION": entity = new DxfRegion(); break; case "RTEXT": entity = new DxfRText(); break; case "SECTION": entity = new DxfEntitySection(); break; case "SEQEND": entity = new DxfSeqend(); break; case "SHAPE": entity = new DxfShape(); break; case "SOLID": entity = new DxfSolid(); break; case "SPLINE": entity = new DxfSpline(); break; case "TEXT": entity = new DxfText(); break; case "TOLERANCE": entity = new DxfTolerance(); break; case "TRACE": entity = new DxfTrace(); break; case "UNDERLAY": entity = new DxfUnderlay(); break; case "DGNUNDERLAY": entity = new DxfDgnUnderlay(); break; case "DWFUNDERLAY": entity = new DxfDwfUnderlay(); break; case "PDFUNDERLAY": entity = new DxfPdfUnderlay(); break; case "VERTEX": entity = new DxfVertex(); break; case "WIPEOUT": entity = new DxfWipeout(); break; case "XLINE": entity = new DxfXLine(); break; default: SwallowEntity(buffer); entity = null; break; } if (entity != null) { entity = entity.PopulateFromBuffer(buffer); } return(entity); }
internal static DxfEntity FromBuffer(DxfCodePairBufferReader buffer) { var first = buffer.Peek(); buffer.Advance(); DxfEntity entity; switch (first.StringValue) { case "3DFACE": entity = new Dxf3DFace(); break; case "3DSOLID": entity = new Dxf3DSolid(); break; case "ACAD_PROXY_ENTITY": entity = new DxfProxyEntity(); break; case "ARC": entity = new DxfArc(); break; case "ARCALIGNEDTEXT": entity = new DxfArcAlignedText(); break; case "ATTDEF": entity = new DxfAttributeDefinition(); break; case "ATTRIB": entity = new DxfAttribute(); break; case "BODY": entity = new DxfBody(); break; case "CIRCLE": entity = new DxfCircle(); break; case "DIMENSION": entity = new DxfDimensionBase(); break; case "ELLIPSE": entity = new DxfEllipse(); break; case "HELIX": entity = new DxfHelix(); break; case "IMAGE": entity = new DxfImage(); break; case "INSERT": entity = new DxfInsert(); break; case "LEADER": entity = new DxfLeader(); break; case "LIGHT": entity = new DxfLight(); break; case "LINE": case "3DLINE": entity = new DxfLine(); break; case "LWPOLYLINE": entity = new DxfLwPolyline(); break; case "MLINE": entity = new DxfMLine(); break; case "MLEADERSTYLE": entity = new DxfMLeaderStyle(); break; case "MTEXT": entity = new DxfMText(); break; case "OLEFRAME": entity = new DxfOleFrame(); break; case "OLE2FRAME": entity = new DxfOle2Frame(); break; case "POINT": entity = new DxfModelPoint(); break; case "POLYLINE": entity = new DxfPolyline(); break; case "RAY": entity = new DxfRay(); break; case "REGION": entity = new DxfRegion(); break; case "RTEXT": entity = new DxfRText(); break; case "SECTION": entity = new DxfEntitySection(); break; case "SEQEND": entity = new DxfSeqend(); break; case "SHAPE": entity = new DxfShape(); break; case "SOLID": entity = new DxfSolid(); break; case "SPLINE": entity = new DxfSpline(); break; case "SUN": entity = new DxfSun(); break; case "TEXT": entity = new DxfText(); break; case "TOLERANCE": entity = new DxfTolerance(); break; case "TRACE": entity = new DxfTrace(); break; case "UNDERLAY": entity = new DxfUnderlay(); break; case "DGNUNDERLAY": entity = new DxfDgnUnderlay(); break; case "DWFUNDERLAY": entity = new DxfDwfUnderlay(); break; case "PDFUNDERLAY": entity = new DxfPdfUnderlay(); break; case "VERTEX": entity = new DxfVertex(); break; case "WIPEOUT": entity = new DxfWipeout(); break; case "XLINE": entity = new DxfXLine(); break; default: SwallowEntity(buffer); entity = null; break; } if (entity != null) { entity = entity.PopulateFromBuffer(buffer); } return entity; }
private void WriteArc(DxfArc arc) { WriteItemType(DxbItemType.Arc); WriteN(arc.Center.X); WriteN(arc.Center.Y); WriteN(arc.Radius); WriteA(arc.StartAngle); WriteA(arc.EndAngle); }