求一C#程序 求一C#程序
如图,初始状态, 大圆与小圆内切,小圆上固定有一(红)点,假设点的位置已确定。
目标:用C#实现:当小圆沿大圆内缘无滑动滚动,用紫色描绘出红点所经过的轨迹。
(图中填充的绿色与蓝色仅为让意思更清晰,实际作圆时不用填充,作空心圆即可)
这个问题我想了很久,真的想不到如何实现,有劳各位大大们费心了。
解决后视解决时间和程序效果追50-100分。
追问:能说明一下各函数的作用 和 关键变量表示的意思吗?
如图,初始状态, 大圆与小圆内切,小圆上固定有一(红)点,假设点的位置已确定。
目标:用C#实现:当小圆沿大圆内缘无滑动滚动,用紫色描绘出红点所经过的轨迹。
(图中填充的绿色与蓝色仅为让意思更清晰,实际作圆时不用填充,作空心圆即可)
这个问题我想了很久,真的想不到如何实现,有劳各位大大们费心了。
解决后视解决时间和程序效果追50-100分。
追问:能说明一下各函数的作用 和 关键变量表示的意思吗?
答案:
Rectangle GetLittleRect(Rectangle bigRect,int LittleR, double Angle)
{
Point BigCenter = new Point(bigRect.Left + bigRect.Width / 2, bigRect.Top + bigRect.Height / 2);
Rectangle result = new Rectangle();
result.Width =2*LittleR;
result.Height = 2*LittleR;
Point LittleCenter = new Point(Convert.ToInt16(bigRect.X + bigRect.Width / 2 + (bigRect.Width / 2 - LittleR) * Math.Sin(Angle)),
Convert.ToInt16(bigRect.Y + bigRect.Height / 2 + (bigRect.Height / 2 - LittleR) * Math.Cos(Angle)));
result.X = LittleCenter.X - LittleR;
result.Y = LittleCenter.Y - LittleR;
return result;
}
double GetLittleAngel(Rectangle bigRect,int littleR, double Angel)
{
return (bigRect.Width/2* Angel)/littleR;
}
struct CPPostion
{
public double angle;//内点圆心连线相对于水平线的偏角
public int length;//距圆心的距离
};
private Point GetPoint(CPPostion p, Rectangle littleRect,double incAngel)
{
int r = littleRect.Width / 2;
return new Point(Convert.ToInt16(littleRect.X + r - p.length * Math.Cos(p.angle + incAngel)),
Convert.ToInt16(littleRect.Y +r - p.length * Math.Sin(p.angle + incAngel)));
}
private void button1_Click(object sender, EventArgs e)
{
Graphics g = this.CreateGraphics();
g.Clear(Color.White);
Pen pBig = new Pen(Color.Red), pLittle = new Pen(Color.Blue),pPoint=new Pen(Color.Purple);
Rectangle bigRect = new Rectangle(100, 100, 300, 300), oldlittleRect, newlittleRect;
g.DrawEllipse(pBig, bigRect);
double AngelStep = 0.1;
int littleR = 30;
double angel = 0,littleAng=GetLittleAngel(bigRect,littleR,AngelStep);
CPPostion thePoint;
thePoint.angle = 0;
thePoint.length = 20;
oldlittleRect = GetLittleRect(bigRect, littleR, angel);
//g.DrawEllipse(pLittle, oldlittleRect);
while (true)
{
angel += AngelStep;
newlittleRect=GetLittleRect(bigRect, littleR, angel);
//g.DrawEllipse(pLittle, newlittleRect);
g.DrawLine(pPoint, GetPoint(thePoint, oldlittleRect, 0), GetPoint(thePoint, newlittleRect, littleAng));
thePoint.angle += littleAng;// littleAng;
oldlittleRect = newlittleRect;
//System.Threading.Thread.Sleep(300);
if (angel > 2 * Math.PI) break;
}
}
}通过该点做蓝色圆的同心圆 那么这圆点的轨迹和蓝色圆上的点一样了
上一个:C#如何编写并调用DLL
下一个:c#中的静态表示什么?