To handle curves on polylines, Autodesk uses the efficient bulge. A bulge is a double (real, floating, whatever you call it) is the tangent of 1/4 of the included angle of a curve segment.
This is very efficient since with a polyline, you already have the start and end point and with this and the bulge you can figure out all the other data of a curve. Of course, this is not easy in the coding world.
I first worked with Bulges in the Lisp world and learned a lot from the nice tutorial that AfraLisp has with some clear imagery (I am a visual person.). Now I am working with them so much in .Net that I thought I would write a simple class and share it with others (see below). You can create a New Bulge by entering the bulge, start point, and end point. I will probably add to this as I go and have not tested it fully so feel free to comment.
Personal Battle of the Bulge
Since going from working out in the field to sitting behind an office, I have put on some weight. Nothing new there – I think it happens to most of us computer guys. However, I am sick of it and am ready to make some changes. Today, I start a 3 month personal challenge. If you are curious, you can follow my victories (and probably pitfalls) at http://30pndsin3mnths.blogspot.com/
The Code-
Public Class BulgeData
Private rad As Double = Nothing
Private cPnt As Point3d = Nothing
Private chdLen As Double = Nothing
Private del As Double = Nothing
Private startAng As Double = Nothing
Private endAng As Double = Nothing
Private bul As Double = Nothing
Private stPnt As Point3d = Nothing
Private endPt As Point3d = Nothing
Public Sub New(ByVal Bulge As Double, ByVal StartPoint As Point3d, ByVal EndPoint As Point3d)
Dim pt2St As New Point2d(StartPoint.X, StartPoint.Y)
Dim pt2End As New Point2d(EndPoint.X, EndPoint.Y)
chdLen = pt2St.GetDistanceTo(pt2End)
Dim sign As Double = 1.0
If Bulge > 0.0 Then sign = -1.0
del = Math.Atan(Math.Abs(Bulge)) * 4
rad = Math.Abs(chdLen / (2 * Math.Sin(del / 2.0)))
Dim vec As Vector3d = EndPoint - StartPoint
Dim pln As New Plane(New Point3d(0, 0, 0), New Vector3d(0, 0, 1))
'Find the angle of the chord
Dim ang As Double = vec.AngleOnPlane(pln)
cPnt = MiscTools.PolarPoint(StartPoint, ang + (((del - Math.PI) * sign) * 0.5), rad)
vec = cPnt - StartPoint
startAng = vec.AngleOnPlane(pln)
vec = cPnt - EndPoint
endAng = vec.AngleOnPlane(pln)
bul = Bulge
stPnt = StartPoint
endPt = EndPoint
End Sub
Public Sub New(ByVal Bulge As Double)
bul = Bulge
End Sub
Public ReadOnly Property ChordLength() As Double
Get
ChordLength = chdLen
End Get
End Property
Public ReadOnly Property Delta() As Double
Get
Delta = del
End Get
End Property
Public ReadOnly Property Radius() As Double
Get
Radius = rad
End Get
End Property
Public ReadOnly Property CenterPoint() As Point3d
Get
CenterPoint = cPnt
End Get
End Property
Public ReadOnly Property StartAngle() As Double
Get
StartAngle = startAng
End Get
End Property
Public ReadOnly Property StartPoint() As Point3d
Get
StartPoint = stPnt
End Get
End Property
Public ReadOnly Property EndPoint() As Point3d
Get
EndPoint = endPt
End Get
End Property
Public ReadOnly Property EndAngle() As Double
Get
EndAngle = endAng
End Get
End Property
Public ReadOnly Property Bulge() As Double
Get
Bulge = bul
End Get
End Property
End Class
Josh,
I commend the effort and thought you are putting into your personal battle of the bulge. If I could make one suggestion though, and I think James might even agree. Forget watching what you eat, forget watching what you drink. Get out, be active, sign up for a 5 or a 10k, run 10 or 15 miles a week. The weight comes peeling off, and you still get to knock back a six pack when you feel the need.
20 miles a week will do wonders, won’t it Nick?
Sign up and take a running class, target one of the local Half Marathons and it will be almost impossble to not lost weight in a sensible manner if you keep going to the class and keep up with the miles. I’m down 40 from about 20 months ago now, and have made only moderate changes in diet.
Anyway, before this turns into the Jenny Craig Website, I’m going to see what I can do as far as formatting on the post. I’ll let you know if what I tweak, Josh.
Thanks Nick. Good luck Josh. I am almost tempted to lose some myself and found http://jeffgalloway.typepad.com/jeff_galloways_blog/ recently. I’ve run a 5k once in each of the past two years and I resolve to increase my running this year and shed a few too!
Wow guys! Thanks for the support and suggestions.
Nick, I was expecting a running comment from James but not you. 🙂
An exercise program (including running) was started last week. If all goes well, I will be able to do exactly as you suggest by the end of the three months. Of course, starting to run in this cold (it is all relative guys) is a bit of a challenge.
James, Do what you need to regarding the post/comments.
Josh,
Me and Dan were the instigators in getting James to enter his first 5k a couple years ago during one of his visits to Manchester. He has gone alot more hog wild than have I with the running, as I only did my first half marathon this fall.
I hope you meet your goal faster than you expect Joshua.
Best wishes.