如何在CF中绘制部分椭圆?(完整框架中的Graphics.DrawArc)

如何在CF中绘制部分椭圆?(完整框架中的Graphics.DrawArc),graphics,drawing,compact-framework,system.drawing,compact-framework2.0,Graphics,Drawing,Compact Framework,System.drawing,Compact Framework2.0,我希望会有一个简单的答案,因为通常情况下,从紧凑框架中剥离出来的东西会以一种看似迂回的方式执行,但效果与完整框架一样好(或者可以提高效率) 简单地说,我希望能够在CompactFramework2.0中实现类似System.Drawing.Graphics.DrawArc(…)的功能 它适用于UserControl的OnPaint覆盖,其中在已填充的椭圆内绘制圆弧 本质上(关闭伪代码,请忽略参数中的缺陷): 我只在90度空间中绘制圆弧,因此椭圆圆弧的右下角或左上角。如果任何角度的答案都是迂回的、

我希望会有一个简单的答案,因为通常情况下,从紧凑框架中剥离出来的东西会以一种看似迂回的方式执行,但效果与完整框架一样好(或者可以提高效率)

简单地说,我希望能够在CompactFramework2.0中实现类似System.Drawing.Graphics.DrawArc(…)的功能

它适用于UserControl的OnPaint覆盖,其中在已填充的椭圆内绘制圆弧

本质上(关闭伪代码,请忽略参数中的缺陷):


我只在90度空间中绘制圆弧,因此椭圆圆弧的右下角或左上角。如果任何角度的答案都是迂回的、困难的或低效的,而只做一个椭圆的角有一个简单的解决方案,我同意后者,尽管前者可以帮助其他有类似问题的人。

我使用此代码,然后将FillPolygon或DrawPolygon与输出点一起使用:

private Point[] CreateArc(float StartAngle, float SweepAngle, int PointsInArc, int Radius, int xOffset, int yOffset, int LineWidth)
{
    if(PointsInArc < 0)
        PointsInArc = 0;

    if(PointsInArc > 360)
        PointsInArc = 360;

    Point[] points = new Point[PointsInArc * 2];
    int xo;
    int yo;
    int xi;
    int yi;
    float degs;
    double rads;

    for(int p = 0 ; p < PointsInArc ; p++)
    {
        degs = StartAngle + ((SweepAngle / PointsInArc) * p);

        rads = (degs * (Math.PI / 180));

        xo = (int)(Radius * Math.Sin(rads));
        yo = (int)(Radius * Math.Cos(rads));
        xi = (int)((Radius - LineWidth) * Math.Sin(rads));
        yi = (int)((Radius - LineWidth) * Math.Cos(rads));

        xo += (Radius + xOffset);
        yo = Radius - yo + yOffset;
        xi += (Radius + xOffset);
        yi = Radius - yi + yOffset;

        points[p] = new Point(xo, yo);
        points[(PointsInArc * 2) - (p + 1)] = new Point(xi, yi);
    }

    return points;
}
private Point[]CreateArc(浮点起始角、浮点扫掠角、int PointsInArc、int半径、int xOffset、int yOffset、int线宽)
{
如果(点圆弧<0)
点sinArc=0;
如果(点圆弧>360)
点sinArc=360;
点[]点=新点[PointsInArc*2];
int-xo;
int-yo;
国际席上;
尹毅;
浮子脱气;
双拉德;
对于(int p=0;p
我使用此代码,然后将FillPolygon或DrawPolygon与输出点一起使用:

private Point[] CreateArc(float StartAngle, float SweepAngle, int PointsInArc, int Radius, int xOffset, int yOffset, int LineWidth)
{
    if(PointsInArc < 0)
        PointsInArc = 0;

    if(PointsInArc > 360)
        PointsInArc = 360;

    Point[] points = new Point[PointsInArc * 2];
    int xo;
    int yo;
    int xi;
    int yi;
    float degs;
    double rads;

    for(int p = 0 ; p < PointsInArc ; p++)
    {
        degs = StartAngle + ((SweepAngle / PointsInArc) * p);

        rads = (degs * (Math.PI / 180));

        xo = (int)(Radius * Math.Sin(rads));
        yo = (int)(Radius * Math.Cos(rads));
        xi = (int)((Radius - LineWidth) * Math.Sin(rads));
        yi = (int)((Radius - LineWidth) * Math.Cos(rads));

        xo += (Radius + xOffset);
        yo = Radius - yo + yOffset;
        xi += (Radius + xOffset);
        yi = Radius - yi + yOffset;

        points[p] = new Point(xo, yo);
        points[(PointsInArc * 2) - (p + 1)] = new Point(xi, yi);
    }

    return points;
}
private Point[]CreateArc(浮点起始角、浮点扫掠角、int PointsInArc、int半径、int xOffset、int yOffset、int线宽)
{
如果(点圆弧<0)
点sinArc=0;
如果(点圆弧>360)
点sinArc=360;
点[]点=新点[PointsInArc*2];
int-xo;
int-yo;
国际席上;
尹毅;
浮子脱气;
双拉德;
对于(int p=0;p
根据@ctacke的响应,它为一个圆创建了一个弧形多边形(高度==宽度),我进一步编辑了它,并创建了一个函数,用于为曲线(相对于多边形)和任何椭圆创建点阵列

注意:这里的StartAngle是正午位置,90度是3点钟位置,因此StartAngle=0和SweepAngle=90从正午到3点钟位置形成一条弧。
原始的DrawArc方法将3点钟设置为0度,90度设置为6点钟位置。只需注意用CreateArc替换DrawArc,然后用结果点[]数组替换DrawLines。
我想用这个来进一步改变它,但是为什么要破坏一些有效的东西呢

private Point[] CreateArc(float StartAngle, float SweepAngle, int PointsInArc, int ellipseWidth, int ellipseHeight, int xOffset, int yOffset)
{
    if (PointsInArc < 0)
        PointsInArc = 0;

    if (PointsInArc > 360)
        PointsInArc = 360;

    Point[] points = new Point[PointsInArc];
    int xo;
    int yo;
    float degs;
    double rads;

    //could have WidthRadius and HeightRadius be parameters, but easier
    // for maintenance to have the diameters sent in instead, matching closer
    // to DrawEllipse and similar methods
    double radiusW = (double)ellipseWidth / 2.0;
    double radiusH = (double)ellipseHeight / 2.0;

    for (int p = 0; p < PointsInArc; p++)
    {
        degs = StartAngle + ((SweepAngle / PointsInArc) * p);

        rads = (degs * (Math.PI / 180));

        xo = (int)Math.Round(radiusW * Math.Sin(rads), 0);
        yo = (int)Math.Round(radiusH * Math.Cos(rads), 0);

        xo += (int)Math.Round(radiusW, 0) + xOffset;
        yo = (int)Math.Round(radiusH, 0) - yo + yOffset;

        points[p] = new Point(xo, yo);
    }

    return points;
}
private Point[]CreateArc(浮点起始角、浮点扫描角、int PointsInArc、int椭圆宽度、int椭圆高度、int xOffset、int yOffset)
{
如果(点圆弧<0)
点sinArc=0;
如果(点圆弧>360)
点sinArc=360;
点[]点=新点[PointsInArc];
int-xo;
int-yo;
浮子脱气;
双拉德;
//可以将WidthRadius和HeightRadius作为参数,但更简单
//为便于维护,请将直径发送至,匹配更紧密
//使用类似的方法
双半径W=(双)椭圆宽度/2.0;
双半径=(双)椭圆高度/2.0;
对于(int p=0;p
根据@ctacke的响应,它为一个圆创建了一个弧形多边形(高度==宽度),我进一步编辑了它,并创建了一个函数,用于为曲线(相对于多边形)和任何椭圆创建点阵列

注意:这里的StartAngle是正午位置,90度是3点钟位置,因此StartAngle=0和SweepAngle=90从正午到3点钟位置形成一条弧。
原始的DrawArc方法将3点钟设置为0度,90度设置为6点钟位置。只需注意用CreateArc替换DrawArc,然后用结果点[]数组替换DrawLines。
我想用这个来进一步改变它,但是为什么要破坏一些有效的东西呢

private Point[] CreateArc(float StartAngle, float SweepAngle, int PointsInArc, int ellipseWidth, int ellipseHeight, int xOffset, int yOffset)
{
    if (PointsInArc < 0)
        PointsInArc = 0;

    if (PointsInArc > 360)
        PointsInArc = 360;

    Point[] points = new Point[PointsInArc];
    int xo;
    int yo;
    float degs;
    double rads;

    //could have WidthRadius and HeightRadius be parameters, but easier
    // for maintenance to have the diameters sent in instead, matching closer
    // to DrawEllipse and similar methods
    double radiusW = (double)ellipseWidth / 2.0;
    double radiusH = (double)ellipseHeight / 2.0;

    for (int p = 0; p < PointsInArc; p++)
    {
        degs = StartAngle + ((SweepAngle / PointsInArc) * p);

        rads = (degs * (Math.PI / 180));

        xo = (int)Math.Round(radiusW * Math.Sin(rads), 0);
        yo = (int)Math.Round(radiusH * Math.Cos(rads), 0);

        xo += (int)Math.Round(radiusW, 0) + xOffset;
        yo = (int)Math.Round(radiusH, 0) - yo + yOffset;

        points[p] = new Point(xo, yo);
    }

    return points;
}
private Point[]CreateArc(浮点起始角、浮点扫描角、int PointsInArc、int椭圆宽度、int椭圆高度、int xOffset、int yOffset)
{
如果(点圆弧<0)
点sinArc=0;
如果(点圆弧>360)
点sinArc=360;
点[]p