在Silverlight中使用C#以编程方式绘制

在Silverlight中使用C#以编程方式绘制,c#,silverlight,drawing,C#,Silverlight,Drawing,我正在尝试使用C#在Silverlight中创建一个Aitoff Hammer网格。它应该看起来像减去点和数字 我不是一名程序员,但我已经能够使用ActionScript文件拼凑起来,完成与我的前任编写的相同的事情。 如你所见,我得到了网格加上不需要的对角线。我不知道如何避免在代码中绘制对角线 如果有人能帮我解决问题或指出我可能做错了什么,我将不胜感激。如果我遗漏了重要信息,请告诉我。谢谢 这是我的密码: PolyLineSegment segment = new PolyLineSegment

我正在尝试使用C#在Silverlight中创建一个Aitoff Hammer网格。它应该看起来像减去点和数字

我不是一名程序员,但我已经能够使用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;
    }
}
PolyLineSegment=新的PolyLineSegment();
PathFigure=新的PathFigure();
figure.StartPoint=新点(X中心,Y中心);
PathGeometry=新的PathGeometry();
路径路径=新路径();
path.Stroke=新的SolidColorBrush(Colors.Black);
path.StrokeThickness=2;
aitoff coords=新的aitoff();

对于(int ra=0;ra来说,对角线多余的线是存在的,因为您正在向同一图形添加点和线段。笔永远不会从纸上提起。您必须将几何体拆分为更多图形

将您创建的线段和图形复制到您希望笔“向下”的每个位置,并将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);

for(int ra=0;ra存在多余的对角线,因为您正在向同一图形添加点和线段。笔永远不会从纸上提起。您必须将几何体拆分为更多图形

将您创建的线段和图形复制到您希望笔“向下”的每个位置,并将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);

用于(int ra=0;ra您在代码中而不是在XAML中这样做是有原因的吗?我将向网格中添加元素,我认为如果我可以通过编程方式在网格上寻址点,这将更容易。您在代码中而不是在XAML中这样做是有原因的吗?我将向网格中添加元素,如果我可以在t上寻址点,这将更容易他以编程方式使用网格。不幸的是,这种方法似乎不起作用。可能是因为即使我使用新的PolyLineSegment()在每个循环中,整体图形仍然连接点。我可以做每个小部分,但那将是很多代码,用单独的变量做同样的事情。这不是最好的方法,但我想如果没有其他选择,我可能不得不接受它。我错了。将图形分割成段是不够的。f中的段igure是隐式连接的。实际上,你必须将你的几何体分割成更多的图形。我对它进行了事件测试,现在看起来相当不错。Guge,你就是那个人!非常感谢!这确实帮助了我。不幸的是,这种方法似乎不起作用。可能是因为即使我做了一个新的PolyLineSegment()在每个循环中,整体图形仍然连接点。我可以做每个小部分,但那将是很多代码,用单独的变量做同样的事情。这不是最好的方法,但我想如果没有其他选择,我可能不得不接受它。我错了。将图形分割成段是不够的。f中的段igure是隐式连接的。实际上,你必须将你的几何体分割成更多的图形。我对它进行了事件测试,现在看起来相当不错。Guge,你就是那个人!非常感谢!这真的帮了我大忙。