internal void recalcArrowHead(ArrowHeadShape ah, PointF pt1, PointF pt2) { float dx = pt2.X - pt1.X; float dy = pt2.Y - pt1.Y; float l = (float)Math.Sqrt(dx * dx + dy * dy); if (l == 0) { ah.defined = false; return; } ah.defined = true; float sine = +dx / l; float cosine = -dy / l; int pts, c = 0, ch = 0; float x, y, r; for (int i = 0; i < elements.Count; ++i) { EArrowHeadElement el = (EArrowHeadElement)elements[i]; switch (el) { case EArrowHeadElement.heLine: for (int j = 0; j < 2; ++j) { x = (float)coords[c++] * ah.size; y = (float)coords[c++] * ah.size; ah.coords[ch++] = x * cosine - y * sine + pt2.X; ah.coords[ch++] = x * sine + y * cosine + pt2.Y; } break; case EArrowHeadElement.heShape: pts = (int)elements[++i]; for (int j = 0; j < pts; ++j) { x = (float)coords[c++] * ah.size; y = (float)coords[c++] * ah.size; ah.coords[ch++] = x * cosine - y * sine + pt2.X; ah.coords[ch++] = x * sine + y * cosine + pt2.Y; } break; case EArrowHeadElement.heCircle: x = (float)coords[c++] * ah.size; y = (float)coords[c++] * ah.size; r = (float)coords[c++] * ah.size; ah.coords[ch++] = x * cosine - y * sine + pt2.X; ah.coords[ch++] = x * sine + y * cosine + pt2.Y; ah.coords[ch++] = r; break; } // switch (el) } // for ( }
internal void draw(Graphics g, System.Drawing.Pen pen, System.Drawing.Brush brush, float xoff, float yoff) { if (!defined) { return; } int c = 0; for (int i = 0; i < elements.GetLength(0); ++i) { EArrowHeadElement el = (EArrowHeadElement)elements[i]; switch (el) { case EArrowHeadElement.heLine: { float x1 = coords[c++] + xoff; float y1 = coords[c++] + yoff; float x2 = coords[c++] + xoff; float y2 = coords[c++] + yoff; g.DrawLine(pen, new PointF(x1, y1), new PointF(x2, y2)); } break; case EArrowHeadElement.heShape: { int pts = elements[++i]; PointF[] shape = new PointF[pts]; for (int j = 0; j < pts; ++j) { shape[j].X = coords[c++] + xoff; shape[j].Y = coords[c++] + yoff; } g.FillPolygon(brush, shape); g.DrawPolygon(pen, shape); } break; case EArrowHeadElement.heCircle: { float cx = coords[c++] + xoff; float cy = coords[c++] + yoff; float r = coords[c++]; g.FillEllipse(brush, cx - r, cy - r, 2 * r, 2 * r); g.DrawEllipse(pen, cx - r, cy - r, 2 * r, 2 * r); } break; } // switch (el) } }