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