当前位置:编程学习 > C#/ASP.NET >>

求一C#程序 求一C#程序

 

如图,初始状态, 大圆与小圆内切,小圆上固定有一(红)点,假设点的位置已确定。

 

目标:用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#中的静态表示什么?

CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,