Рисование двутавровой балки на основе двух точек - PullRequest
2 голосов
/ 07 сентября 2011

У меня есть две точечные структуры, и мне нужно нарисовать I-Beam на основе этих точек, где каждая точка представляет поперечное сечение по обе стороны от I-Beam. Ширина торцевых крышек должна быть фиксированной и произвольной.

В основном мне нужно нарисовать три линии. Сначала я проведу DrawLine (Point1, Point2), затем мне понадобится математика, чтобы выяснить, как нарисовать следующие две линии на перпендикулярных углах, чтобы они центрировались на Point1 и Point2.

На рисунке ниже показано, что мне нужно нарисовать на основе центральной линии. Однако эта линия может быть под любым углом. Point1 и Point2, которые соединяют линию, могут находиться в любом месте в 2D-пространстве.

Example of an I-Beam

Ответы [ 2 ]

4 голосов
/ 07 сентября 2011

Вы можете попробовать поиграть с LineCaps:

protected void DrawIBeam(Graphics g, Point fromPoint, Point toPoint)
{
  using (GraphicsPath hPath = new GraphicsPath())
  {
    hPath.AddLine(new Point(-5, 0), new Point(5, 0));
    CustomLineCap myCap = new CustomLineCap(null, hPath);
    myCap.SetStrokeCaps(LineCap.Round, LineCap.Round);
    using (Pen myPen = new Pen(Color.Black, 2))
    {
      myPen.CustomStartCap = myCap;
      myPen.CustomEndCap = myCap;
      g.DrawLine(myPen, fromPoint, toPoint);
    }
  }
}

и назвать его:

DrawIBeam(e.Graphics, new Point(10, 10), new Point(60, 60));

enter image description here

С CustomLineCap Class

1 голос
/ 07 сентября 2011

Принимая ширину, равную половине ширины части I луча, сначала вы найдете наклон первой линии, которую вы нарисовали.

Далее вы берете отрицательную обратную сторону наклона и рисуете линию от точки1 ширины длины в обоих направлениях. Вот почему ширина равна половине ширины, которую вы хотите нарисовать.

Наконец, вы рисуете линию от точки 2 ширины длины в обоих направлениях.

Вот математическая формула для рисования перпендикулярной линии .

...