2017-05-28 236 views
1

我已經嘗試在正多邊形的每個邊上繪製三角形。在正多邊形的每個邊上繪製三角形

到目前爲止,我得讓多邊形是這樣的:

enter image description here

我試圖做的是,在多邊形的各邊的小三角形:

enter image description here

我該怎麼做?

代碼如何繪製多邊形低於:

int sides = 5; 
Graphics g = e.Graphics; 
nPoints = CalculateVertices(sides, radius, angle, center); 

g.DrawPolygon(navypen, nPoints); 
g.FillPolygon(BlueBrush, nPoints); 
Point center = new Point(ClientSize.Width/2, ClientSize.Height/2); 

for(int i = 0; i < sides; i++) { 
    g.DrawLine(new Pen(Color.Navy), center.X, center.Y, nPoints[i].X, nPoints[i].Y); 

} 

private PointF[] CalculateVertices(int sides, int radius, float startingAngle, Point center) 
{ 
    if (sides < 3) { 
     sides = 3; 
    } 
     //throw new ArgumentException("Polygon must have 3 sides or more."); 

    List<PointF> points = new List<PointF>(); 
    float step = 360.0f/sides; 

    float angle = startingAngle; //starting angle 
    for (double i = startingAngle; i < startingAngle + 360.0; i += step) //go in a circle 
    { 
     points.Add(DegreesToXY(angle, radius, center)); 
     angle += step; 
    } 

    return points.ToArray(); 
} 

private PointF DegreesToXY(float degrees, float radius, Point origin) 
{ 
    PointF xy = new PointF(); 
    double radians = degrees * Math.PI/180.0; 

    xy.X = (int)(Math.Cos(radians) * radius + origin.X); 
    xy.Y = (int)(Math.Sin(-radians) * radius + origin.Y); 

    return xy; 
} 

回答

1

嘗試了這一點...而不是在產地爲三角形計算絕對點,我已經爲一個「單位三角」,而不是計算點(使用你的功能!)。然後,我只需旋轉和移動圖形表面,繪製單位三角形,我想它:

Polygon with Triangles on each Edge

public partial class Form1 : Form 
{ 

    public Form1() 
    { 
     InitializeComponent(); 
    } 

    private PointF[] nPoints; 
    private PointF[] triangle; 

    private int sides = 5; 
    private int angle = 0; 
    private int radius = 100; 
    private int triangleLength = 10; 

    private void Form1_Load(object sender, EventArgs e) 
    { 
     triangle = this.CalculateVertices(3, triangleLength, 0, new Point(0, 0)); // this "unit triangle" will get reused! 
    } 

    private void Form1_Paint(object sender, PaintEventArgs e) 
    { 

     Graphics g = e.Graphics; 
     Point center = new Point(ClientSize.Width/2, ClientSize.Height/2); 
     nPoints = CalculateVertices(sides, radius, angle, center); 

     // draw the polygon 
     g.FillPolygon(Brushes.Blue, nPoints); 
     g.DrawPolygon(Pens.Black, nPoints);     
     for (int i = 0; i < sides; i++) 
     { 
      g.DrawLine(Pens.Black, center.X, center.Y, nPoints[i].X, nPoints[i].Y); 

     } 

     // draw small triangles on each edge: 
     float step = 360.0f/sides; 
     float curAngle = angle + step/2; // start in-between the original angles 
     for (double i = curAngle; i < angle + (step/2) + 360.0; i += step) //go in a circle 
     { 
      // move to the center and rotate: 
      g.ResetTransform(); 
      g.TranslateTransform(center.X, center.Y); 
      g.RotateTransform((float)i); 

      // move out to where the triangle will be drawn and render it 
      g.TranslateTransform(radius, 0); 
      g.FillPolygon(Brushes.LightGreen, triangle); 
      g.DrawPolygon(Pens.Black, triangle); 
     } 
    } 

    // this is your code unchanged 
    private PointF[] CalculateVertices(int sides, int radius, float startingAngle, Point center) 
    { 
     if (sides < 3) 
     { 
      sides = 3; 
     } 
     //throw new ArgumentException("Polygon must have 3 sides or more."); 

     List<PointF> points = new List<PointF>(); 
     float step = 360.0f/sides; 

     float angle = startingAngle; //starting angle 
     for (double i = startingAngle; i < startingAngle + 360.0; i += step) //go in a circle 
     { 
      points.Add(DegreesToXY(angle, radius, center)); 
      angle += step; 
     } 

     return points.ToArray(); 
    } 

    // this is your code unchanged 
    private PointF DegreesToXY(float degrees, float radius, Point origin) 
    { 
     PointF xy = new PointF(); 
     double radians = degrees * Math.PI/180.0; 

     xy.X = (int)(Math.Cos(radians) * radius + origin.X); 
     xy.Y = (int)(Math.Sin(-radians) * radius + origin.Y); 

     return xy; 
    } 

} 
+0

你可能有興趣在我的答案在這裏[一個圓上抄寫多邊形(HTTPS:/ /stackoverflow.com/questions/19210569/transcribing-a-polygon-on-a-circle/19214490#19214490)。 –

+0

這對我真的很有幫助!我讓它變得更加複雜。非常感謝!! – user19283043