Рисование программно с использованием C # в Silverlight - PullRequest
1 голос
/ 04 декабря 2009

Я пытаюсь создать сетку Aitoff-Hammer в Silverlight, используя C #. Это должно выглядеть как это минус точки и цифры.

Я не программист, но смог собрать вместе этот , используя файл ActionScript, чтобы сделать то же самое, что было написано моим предшественником Как видите, я получаю сетку плюс ненужные диагональные линии. Я не уверен, как избежать рисования диагональных линий в моем коде.

Буду очень признателен за любую помощь, которую кто-либо может оказать, чтобы решить мою проблему или указать, что я могу делать неправильно. Пожалуйста, дайте мне знать, если я пропустил важную информацию. Спасибо.

Вот мой код:

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 Ответ

4 голосов
/ 04 декабря 2009

Диагональные лишние линии есть, потому что вы добавляете точки и сегменты к одной фигуре. Ручка никогда не поднимается с бумаги. Вы должны разбить свою геометрию на несколько фигур.

Скопируйте создаваемый вами сегмент и фигуры в каждое место, где вы хотите, чтобы перо "пошло вниз", и figure.Segments.Add (сегмент) и geometry.Figures.Add (рисунок) в каждое место, где вы хотите, чтобы перо " идти вверх ".

Таким образом, ваша геометрия будет состоять из множества отдельных фигур, и ваши диагонали больше не должны быть проблемой.

        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);
...