// // (C) Copyright 2003-2019 by Autodesk, Inc. // // Permission to use, copy, modify, and distribute this software in // object code form for any purpose and without fee is hereby granted, // provided that the above copyright notice appears in all copies and // that both that copyright notice and the limited warranty and // restricted rights notice below appear in all supporting // documentation. // // AUTODESK PROVIDES THIS PROGRAM "AS IS" AND WITH ALL FAULTS. // AUTODESK SPECIFICALLY DISCLAIMS ANY IMPLIED WARRANTY OF // MERCHANTABILITY OR FITNESS FOR A PARTICULAR USE. AUTODESK, INC. // DOES NOT WARRANT THAT THE OPERATION OF THE PROGRAM WILL BE // UNINTERRUPTED OR ERROR FREE. // // Use, duplication, or disclosure by the U.S. Government is subject to // restrictions set forth in FAR 52.227-19 (Commercial Computer // Software - Restricted Rights) and DFAR 252.227-7013(c)(1)(ii) // (Rights in Technical Data and Computer Software), as applicable. // namespace Revit.SDK.Samples.Openings.CS { using System; using System.Collections.Generic; using System.Text; using System.Drawing; /// /// represent a geometry segment line /// public class Line2D { private PointF m_startPnt = new PointF(); // start point private PointF m_endPnt = new PointF(); // end point private float m_length; // length of the line // normal of the line; start point to end point private PointF m_normal = new PointF(); private RectangleF m_boundingBox = new RectangleF();// rectangle box contains the line /// /// rectangle box contains the line /// public RectangleF BoundingBox { get { return m_boundingBox; } } /// /// start point of the line; if it is set to new value, /// EndPoint is changeless; Length, Normal and BoundingBox will updated /// public PointF StartPnt { get { return m_startPnt; } set { if (m_startPnt == value) { return; } m_startPnt = value; CalculateDirection(); CalculateBoundingBox(); } } /// /// end point of the line; if it is set to new value, /// StartPoint is changeless; Length, Normal and BoundingBox will updated /// public PointF EndPnt { get { return m_endPnt; } set { if (m_endPnt == value) { return; } m_endPnt = value; CalculateDirection(); CalculateBoundingBox(); } } /// /// Length of the line; if it is set to new value, /// StartPoint and Normal is changeless; EndPoint and BoundingBox will updated /// public float Length { get { return m_length; } set { if (m_length == value) { return; } m_length = value; CalculateEndPoint(); CalculateBoundingBox(); } } /// /// Normal of the line; if it is set to new value, /// StartPoint is changeless; EndPoint and BoundingBox will updated /// public PointF Normal { get { return m_normal; } set { if (m_normal == value) { return; } m_normal = value; CalculateEndPoint(); CalculateBoundingBox(); } } /// /// constructor /// default StartPoint = (0.0, 0.0), EndPoint = (1.0, 0.0) /// public Line2D() { m_startPnt.X = 0.0f; m_startPnt.Y = 0.0f; m_endPnt.X = 1.0f; m_endPnt.Y = 0.0f; CalculateDirection(); CalculateBoundingBox(); } /// /// constructor /// /// StartPoint /// EndPoint public Line2D(PointF startPnt, PointF endPnt) { m_startPnt = startPnt; m_endPnt = endPnt; CalculateDirection(); CalculateBoundingBox(); } /// /// calculate BoundingBox according to StartPoint and EndPoint /// private void CalculateBoundingBox() { float x1 = m_endPnt.X; float x2 = m_startPnt.X; float y1 = m_endPnt.Y; float y2 = m_startPnt.Y; float width = Math.Abs(x1 - x2); float height = Math.Abs(y1 - y2); if (x1 > x2) { x1 = x2; } if (y1 > y2) { y1 = y2; } m_boundingBox = new RectangleF(x1, y1, width, height); } /// /// calculate length by StartPoint and EndPoint /// private void CalculateLength() { m_length = (float)Math.Sqrt(Math.Pow((m_startPnt.X - m_endPnt.X), 2) + Math.Pow((m_startPnt.Y - m_endPnt.Y), 2)); } /// /// calculate Direction by StartPoint and EndPoint /// private void CalculateDirection() { CalculateLength(); m_normal.X = (m_endPnt.X - m_startPnt.X) / m_length; m_normal.Y = (m_endPnt.Y - m_startPnt.Y) / m_length; } /// /// calculate EndPoint by StartPoint, Length and Direction /// private void CalculateEndPoint() { m_endPnt.X = m_startPnt.X + m_length * m_normal.X; m_endPnt.Y = m_startPnt.Y + m_length * m_normal.Y; } } }