2017-07-10 6 views
0

Lines and arcDessine un arc entre deux lignes. Je dois calculer des points

Je ne trouve pas un moyen de dessiner ARC entre deux lignes. Ma contrainte est: Je dois calculer ces points de course d'arc. Comme j'utilise InkCanvas et que je dois dessiner cet arc point par point, je ne peux pas mettre d'objet sur l'écran ou sur le canevas. Donc, je sais que je peux dessiner n'importe quel arc avec l'objet PATH et utiliser ArcSegment. Avec cette méthode oui je peux dessiner l'arc mais ce n'est pas le point de coup sur la toile. Pour cette raison, je ne peux pas le supprimer ou le sauvegarder. De toute façon j'ai besoin de calculer cette arche point par point.

Je code cercle dessin sur toile comme ceci:

Stroke GetCircleStroke(int centerX, int centerY, int radiusX, int radiusY,double angletoDraw=2.0) 
     { 
      StylusPointCollection strokePoints = new StylusPointCollection(); 

      int numTotalSteps = 180; 

      for (int i = 0; i <= numTotalSteps; i++) 
      { 
       double angle = angletoDraw * Math.PI * (double)i/(double)numTotalSteps; 
       StylusPoint sp = new StylusPoint(); 
       //compute x and y points 
       sp.X = centerX + Math.Cos(angle) * radiusX; 
       sp.Y = centerY - Math.Sin(angle) * radiusY; 

       //add to the collection 
       strokePoints.Add(sp); 
      } 

      Stroke newStroke = new Stroke(strokePoints); 
      return newStroke; 

     } 

je peux dessiner le cercle easly, mais je ne pouvais pas trouver un moyen de dessiner un arc :(

Nous savons point central X, Y et nous savons Ligne1 et les coordonnées Line2. Je ne sais pas ce que l'arc ..

Pourriez-vous s'il vous plaît me aider pour les points d'arc comme calculate cette façon?

Répondre

3

vous avez quelques concepts qui volent autour comme Line/Segment, Point, Circle, etc. Au lieu de faire un désordre de code difficile à comprendre, essayons de décomposer le problème en plus petites parties qui sont plus faciles à digérer.

Vous avez une idée de point, ok, permet de mettre en œuvre un:

public struct Point2D //omitted equality logic 
{ 
    public double X { get; } 
    public double Y { get; } 

    public Point2D(double x, double y) 
    { 
     X = x; 
     Y = y; 
    } 

    public override string ToString() => $"{X:N3}; {Y:N3}"; 
} 

Ok, nous avons aussi une notion de Segment ou delimitted Line:

public struct Segment2D 
{ 
    public Point2D Start { get; } 
    public Point2D End { get; } 
    public double Argument => Math.Atan2(End.Y - Start.Y , End.X - Start.X); 

    public Segment2D(Point2D start, Point2D end) 
    { 
     Start = start; 
     End = end; 
    } 
} 

Et dernier, mais non le moindre, nous avons la notion de Cercle:

public struct Circle2D 
{ 
    private const double FullCircleAngle = 2 * Math.PI; 
    public Point2D Center { get; } 
    public double Radius { get; } 

    public Circle2D(Point2D center, double radius) 
    { 
     if (radius <= 0) 
      throw new ArgumentOutOfRangeException(nameof(radius)); 

     Center = center; 
     Radius = radius; 
    } 

    public IEnumerable<Point2D> GetPointsOfArch(int numberOfPoints, double startAngle, double endAngle) 
    { 
     double normalizedEndAngle; 

     if (startAngle < endAngle) 
     { 
      normalizedEndAngle = endAngle; 
     } 
     else 
     { 
      normalizedEndAngle = endAngle + FullCircleAngle; 
     } 

     var angleRange = normalizedEndAngle - startAngle; 
     angleRange = angleRange > FullCircleAngle ? FullCircleAngle : angleRange; 
     var step = angleRange/numberOfPoints; 
     var currentAngle = startAngle; 

     while (currentAngle <= normalizedEndAngle) 
     { 
      var x = Center.X + Radius * Math.Cos(currentAngle); 
      var y = Center.Y + Radius * Math.Sin(currentAngle); 
      yield return new Point2D(x, y); 
      currentAngle += step; 
     } 
    } 

    public IEnumerable<Point2D> GetPoints(int numberOfPoints) 
     => GetPointsOfArch(numberOfPoints, 0, FullCircleAngle); 
} 

Étudier la mise en œuvre de GetPointsOfArch, il ne devrait pas être trop difficile à comprendre.

Et maintenant, pour résoudre votre problème, vous feriez:

var myCircle = new Circle2D(new Point2D(centerX, centerY), radius); 
var line1 = .... 
var line2 = .... 
var archPoints = myCircle.GetPointsOfArch(number, line2.Argument, line1.Argument); 

est-ce pas beaucoup plus facile à lire, suivre et à comprendre?

+0

Vous devez être un bon penseur, merci. Le point était: ** Essayons de décomposer le problème en parties plus petites qui sont plus faciles à digérer. ** – wikiCan