2009-12-04 19 views
1

J'essaie de créer une grille Aitoff-Hammer dans Silverlight en utilisant C#. Cela devrait ressembler à this moins les points et les nombres.Dessin par programmation en utilisant C# dans Silverlight

Je ne suis pas un programmeur mais j'ai pu reconstituer this en utilisant un fichier ActionScript pour faire la même chose que celle qui a été écrite par mon prédécesseur. Comme vous pouvez le voir, je reçois la grille plus les lignes diagonales indésirables. Je ne sais pas comment éviter que les lignes diagonales soient dessinées dans mon code.

Toute aide que quelqu'un peut fournir pour résoudre mon problème ou pour signaler ce que je fais peut être très appréciée. S'il vous plaît laissez-moi savoir si j'ai omis des informations importantes. Merci.

Voici mon code:

PolyLineSegment segment = new PolyLineSegment(); 

PathFigure figure = new PathFigure(); 

figure.StartPoint = new Point(xCenter, yCenter); 

PathGeometry geometry = new PathGeometry(); 

Path path = new Path(); 

path.Stroke = new SolidColorBrush(Colors.Black); 

path.StrokeThickness = 2; 
aitoff coords = new aitoff(); 

for (int ra = 0; ra <= 24; ra = ra + 3) 
{ 
    for (int dec = -90; dec <= 90; dec = dec + 3) 
    { 
     points = coords.GetAitoffCoord(ra, dec); 
     double xCoord = xCenter + points.X * width/2; 
     double yCoord = yCenter + points.Y * height/2; 
     segment.Points.Add(new Point(xCoord, yCoord));     
    } 
}  

for (int dec = -90; dec <= 90; dec = dec + 30) 
{ 
    for (int ra = 0; ra <= 12; ra = ra + 1) 
    { 
     points = coords.GetAitoffCoord(ra, dec); 
     double xCoord = xCenter + points.X * width/2; 
     double yCoord = yCenter + points.Y * height/2;     
     segment.Points.Add(new Point(xCoord, yCoord)); 
    } 
} 

for (int dec = -90; dec <= 90; dec = dec + 30) 
{ 
    for (double ra = 12.01; ra <= 25; ra++) 
    { 
     points = coords.GetAitoffCoord(ra, dec); 
     double xCoord = xCenter + points.X * width/2; 
     double yCoord = yCenter + points.Y * height/2; 
     segment.Points.Add(new Point(xCoord, yCoord)); 
    } 
} 

for (int dec = -90; dec <= 90; dec = dec + 3) 
{ 
    double ra = 12.01; 

    points = coords.GetAitoffCoord(ra, dec); 
    double xCoord = xCenter + points.X * width/2; 
    double yCoord = yCenter + points.Y * height/2; 
    segment.Points.Add(new Point(xCoord, yCoord)); 
} 

figure.Segments.Add(segment); 
geometry.Figures.Add(figure); 
path.Data = geometry; 
LayoutRoot.Children.Add(path); 


// GetAitoff 

public class aitoff 
{ 
    double ra; 
    double dec; 

    Point coords = new Point(); 

    double ra2deg = Math.PI/180.0f; 

    public Point GetAitoffCoord(double raIn, double decIn) 
    { 
     ra = raIn * 360/24; 
     dec = decIn; 
     if (ra > 180) 
      ra = ra - 360; 

     double l = ra * ra2deg; 
     double b = dec * ra2deg; 

     double t = Math.Sqrt(2/(1 + Math.Cos(b) * Math.Cos(l/2))); 
     double x = 2 * t * Math.Cos(b) * Math.Sin(l/2); 
     double y = t * Math.Sin(b); 

     coords.X = x/(-2 * Math.Sqrt(2)); 
     coords.Y = y/(-1 * Math.Sqrt(2)); 

     return coords; 
    } 
} 
+1

Y a-t-il une raison pour que vous le fassiez dans le code et pas dans XAML? – Jermismo

+0

Je vais ajouter des éléments à la grille, ce qui je pense serait plus facile si je peux programmer des points sur la grille. – Kamal

Répondre

4

Les lignes diagonales superflues sont là parce que vous ajoutez des points et des segments à la même figure. Le stylo ne se lève jamais du papier. Vous devez diviser votre géométrie en plusieurs chiffres. Copiez votre segment et les figures créant dans chaque endroit où vous voulez que le stylo "descende", et la figure.Segments.Add (segment) et geometry.Figures.Add (figure) dans chaque endroit où vous voulez que le stylo "monter". De cette façon, votre géométrie consistera en de nombreuses figures séparées, et vos diagonales ne devraient plus poser de problème.

 for (int ra = 0; ra <= 24; ra = ra + 3) 
     { 
      figure = new PathFigure(); 
      segment = new PolyLineSegment(); 
      for (int dec = -90; dec <= 90; dec = dec + 3)  
      {   
       points = coords.GetAitoffCoord(ra, dec);   
       double xCoord = xCenter + points.X * width/2;   
       double yCoord = yCenter + points.Y * height/2;   
       segment.Points.Add(new Point(xCoord, yCoord));      
      } 
      figure.StartPoint = segment.Points[0]; 
      figure.Segments.Add(segment); 
      geometry.Figures.Add(figure); 
     } 

     for (int dec = -90; dec <= 90; dec = dec + 30) 
     { 
      figure = new PathFigure(); 
      segment = new PolyLineSegment(); 
      for (int ra = 0; ra <= 12; ra = ra + 1) 
      { 
       points = coords.GetAitoffCoord(ra, dec); 
       double xCoord = xCenter + points.X * width/2; 
       double yCoord = yCenter + points.Y * height/2; 
       segment.Points.Add(new Point(xCoord, yCoord)); 
      } 
      figure.StartPoint = segment.Points[0]; 
      figure.Segments.Add(segment); 
      geometry.Figures.Add(figure); 
     } 

     for (int dec = -90; dec <= 90; dec = dec + 30) 
     { 
      figure = new PathFigure(); 
      segment = new PolyLineSegment(); 
      for (double ra = 12.01; ra <= 25; ra++) 
      { 
       points = coords.GetAitoffCoord(ra, dec); 
       double xCoord = xCenter + points.X * width/2; 
       double yCoord = yCenter + points.Y * height/2; 
       segment.Points.Add(new Point(xCoord, yCoord)); 
      } 
      figure.StartPoint = segment.Points[0]; 
      figure.Segments.Add(segment); 
      geometry.Figures.Add(figure); 
     } 

     figure = new PathFigure(); 
     segment = new PolyLineSegment(); 
     for (int dec = -90; dec <= 90; dec = dec + 3) 
     { 
      double ra = 12.01; 
      points = coords.GetAitoffCoord(ra, dec); 
      double xCoord = xCenter + points.X * width/2; 
      double yCoord = yCenter + points.Y * height/2; 
      segment.Points.Add(new Point(xCoord, yCoord)); 
     } 
     figure.StartPoint = segment.Points[0]; 
     figure.Segments.Add(segment); 
     geometry.Figures.Add(figure); 
+0

Malheureusement, cette approche ne semble pas fonctionner. Probablement parce que même si je fais un nouveau PolyLineSegment() dans chaque boucle, le chiffre global rejoint toujours les points. Je pourrais faire chaque petite section, mais ce serait beaucoup de code qui fait la même chose avec des variables séparées. Pas le meilleur moyen mais je suppose que je devrais vivre avec s'il n'y a pas d'autres options. – Kamal

+0

J'avais tort. Il ne suffit pas de séparer les chiffres en segments. Les segments d'une figure sont implicitement connectés. Vous devez en fait séparer votre géométrie en plus de chiffres. Je l'ai testé, ça a l'air plutôt bien maintenant. – Guge

+1

Guge, vous êtes l'homme! Merci beaucoup! Cela m'a vraiment aidé. – Kamal

Questions connexes