假如一个坐标分别为A(171,145),B(853,145),C(853,473),D(171,473)组成的矩形,在矩形中任意指定一点O,鼠标P在矩形框中移动时自动生成以OP为最初入射线矩形边为水平面的反射线PQ,然后再以PQ为入射线,以此类推,实现四次以上的反射线条,请问如何实现?分不够再加,希望高手指点注意:O点是任意指定的,P是随鼠标移动动态变化的,生成线条也是动态变化的

解决方案 »

  1.   


    Point O,P;
    ...
    double sinx=(O.Y-P.Y)/sqrt((O.Y-P.Y)*(O.Y-P.Y)+(O.X-P.X)*(O.X-P.X));得到正弦值以后,就可以根据这个值来计算其他点了。
    角度动态变化,这个值也可以动态计算。
    很抱歉,没有时间写完整的代码。
      

  2.   

    终于写出一个半成品,只画出了三次反射。不过感觉应该有更好的方法,希望有人改一下哈: public partial class Form1 : Form
    {
    private Point op = new Point(360, 360);
    public Form1()
    {
    InitializeComponent();
    this.DoubleBuffered = true;
    }
    protected override void OnPaint(PaintEventArgs e)
    {
    base.OnPaint(e);
    Point[] pts = { new Point(171, 145), new Point(853, 145), new Point(853, 473), new Point(171, 473) };
    e.Graphics.DrawPolygon(SystemPens.ControlText, pts);
    if (this.Capture)
    { Point mp = this.PointToClient(Cursor.Position);
    e.Graphics.DrawLine(SystemPens.ControlText, op, mp);
    if (mp.X != op.X && mp.Y != op.Y)
    {
    float k = (float)decimal.Divide(mp.Y - op.Y, mp.X - op.X); //B--R
    if (mp.Y > op.Y && mp.X > op.X)
    {
    float y = 473;
    float x = (y - mp.Y) / k + mp.X;
    if (x > 171 && x < 853)
    {
    PointF bp = new PointF(x, y);
    e.Graphics.DrawLine(SystemPens.ControlText, mp, bp); float qx = 853;
    float qy = -k * (qx - bp.X) + bp.Y; if (qy > 145)
    {
    PointF qp = new PointF(qx, qy);
    e.Graphics.DrawLine(SystemPens.ControlText, bp, qp);

    float wy = 145;
    float wx = (wy - qp.Y) / k + qp.X;
    PointF wp = new PointF(wx, wy);
    e.Graphics.DrawLine(SystemPens.ControlText, qp, wp);
    }
    else if (qy < 145)
    {
    float wy = 145;
    float wx = -(wy - qy) / k + qx;
    PointF wp = new PointF(wx, wy); float tx = 853;
    float ty = k * (tx - wp.X) + wp.Y;
    PointF tp = new PointF(tx, ty);
    e.Graphics.DrawLine(SystemPens.ControlText, wp, tp); PointF qp = new PointF(qx, qy);
    e.Graphics.DrawLine(SystemPens.ControlText, bp, wp);
    }
    }
    }
    //B--L
    if (mp.Y > op.Y && mp.X < op.X)
    {
    float y = 473;
    float x = (y - mp.Y) / k + mp.X;
    if (x > 171 && x < 853)
    {
    PointF bp = new PointF(x, y);
    e.Graphics.DrawLine(SystemPens.ControlText, mp, bp); float qx = 171;
    float qy = -k * (qx - bp.X) + bp.Y; if (qy > 145)
    {
    PointF qp = new PointF(qx, qy);
    e.Graphics.DrawLine(SystemPens.ControlText, bp, qp);
    float wy = 145;
    float wx = (wy - qp.Y) / k + qp.X;
    PointF wp = new PointF(wx, wy);
    e.Graphics.DrawLine(SystemPens.ControlText, qp, wp);
    }
    else if (qy < 145)
    {
    float wy = 145;
    float wx = -(wy - qy) / k + qx;
    PointF wp = new PointF(wx, wy); float tx = 171;
    float ty = k * (tx - wp.X) + wp.Y;
    PointF tp = new PointF(tx, ty);
    e.Graphics.DrawLine(SystemPens.ControlText, wp, tp); PointF qp = new PointF(qx, qy);
    e.Graphics.DrawLine(SystemPens.ControlText, bp, wp);
    }
    }
    } //T--R
    if (mp.Y < op.Y && mp.X > op.X)
    {
    float y = 145;
    float x = (y - mp.Y) / k + mp.X;
    if (x > 171 && x < 853)
    {
    PointF bp = new PointF(x, y);
    e.Graphics.DrawLine(SystemPens.ControlText, mp, bp);
    float qx = 853;
    float qy = -k * (qx - bp.X) + bp.Y; if (qy < 473)
    {
    PointF qp = new PointF(qx, qy);
    e.Graphics.DrawLine(SystemPens.ControlText, bp, qp); float wy = 473;
    float wx = (wy - qp.Y) / k + qp.X;
    PointF wp = new PointF(wx, wy);
    e.Graphics.DrawLine(SystemPens.ControlText, qp, wp);
    }
    else if (qy > 473)
    {
    float wy = 473;
    float wx = -(wy - qy) / k + qx;
    PointF wp = new PointF(wx, wy); float tx = 853;
    float ty = k * (tx - wp.X) + wp.Y;
    PointF tp = new PointF(tx, ty);
    e.Graphics.DrawLine(SystemPens.ControlText, wp, tp);

    PointF qp = new PointF(qx, qy);
    e.Graphics.DrawLine(SystemPens.ControlText, bp, wp);
    }
    }
    }
      

  3.   

    接上: //T--L
    if (mp.Y < op.Y && mp.X < op.X)
    {
    float y = 145;
    float x = (y - mp.Y) / k + mp.X;
    if (x > 171 && x < 853)
    {
    PointF bp = new PointF(x, y);
    e.Graphics.DrawLine(SystemPens.ControlText, mp, bp); float qx = 171;
    float qy = -k * (qx - bp.X) + bp.Y;

    if (qy < 473)
    {
    PointF qp = new PointF(qx, qy);
    e.Graphics.DrawLine(SystemPens.ControlText, bp, qp); float wy = 473;
    float wx = (wy - qp.Y) / k + qp.X;
    PointF wp = new PointF(wx, wy);
    e.Graphics.DrawLine(SystemPens.ControlText, qp, wp);
    }
    else if (qy > 473)
    {
    float wy = 473;
    float wx = -(wy - qy) / k + qx;
    PointF wp = new PointF(wx, wy); float tx = 171;
    float ty = k * (tx - wp.X) + wp.Y;
    PointF tp = new PointF(tx, ty);
    e.Graphics.DrawLine(SystemPens.ControlText, wp, tp); PointF qp = new PointF(qx, qy);
    e.Graphics.DrawLine(SystemPens.ControlText, bp, wp);
    }
    }
    }
    //L--B
    if (mp.Y > op.Y && mp.X < op.X)
    {
    float x = 171;
    float y = (x - mp.X) * k + mp.Y;
    if (y > 145 && y < 473)
    {
    PointF bp = new PointF(x, y);
    e.Graphics.DrawLine(SystemPens.ControlText, mp, bp); float qy = 473;
    float qx = -(qy - bp.Y) / k + bp.X; if (qx < 853)
    {
    PointF qp = new PointF(qx, qy);
    e.Graphics.DrawLine(SystemPens.ControlText, bp, qp); float wx = 853;
    float wy = k * (wx - qx) + qy;
    PointF wp = new PointF(wx, wy);
    e.Graphics.DrawLine(SystemPens.ControlText, qp, wp);
    }
    else if (qx > 853)
    {
    float wx = 853;
    float wy = -k * (wx - qx) + qy;
    PointF wp = new PointF(wx, wy); float ty = 473;
    float tx = (ty - wy) / k + wx;
    PointF tp = new PointF(tx, ty); e.Graphics.DrawLine(SystemPens.ControlText, wp, tp); PointF qp = new PointF(qx, qy);
    e.Graphics.DrawLine(SystemPens.ControlText, bp, wp);
    }
    }
    }
    //L--T
    if (mp.Y < op.Y && mp.X < op.X)
    {
    float x = 171;
    float y = (x - mp.X) * k + mp.Y;
    if (y > 145 && y < 473)
    {
    PointF bp = new PointF(x, y);
    e.Graphics.DrawLine(SystemPens.ControlText, mp, bp); float qy = 145;
    float qx = -(qy - bp.Y) / k + bp.X;
    if (qx < 853)
    {
    PointF qp = new PointF(qx, qy);
    e.Graphics.DrawLine(SystemPens.ControlText, bp, qp); float wx = 853;
    float wy = k * (wx - qx) + qy;
    PointF wp = new PointF(wx, wy);
    e.Graphics.DrawLine(SystemPens.ControlText, qp, wp);
    }
    else if (qx > 853)
    {
    float wx = 853;
    float wy = -k * (wx - qx) + qy;
    PointF wp = new PointF(wx, wy); float ty = 145;
    float tx = (ty - wy) / k + wx;
    PointF tp = new PointF(tx, ty); e.Graphics.DrawLine(SystemPens.ControlText, wp, tp); PointF qp = new PointF(qx, qy);
    e.Graphics.DrawLine(SystemPens.ControlText, bp, wp);
    }
    }
    }
    //R--B
    if (mp.Y > op.Y && mp.X > op.X)
    {
    float x = 853;
    float y = (x - mp.X) * k + mp.Y;
    if (y > 145 && y < 473)
    {
    PointF bp = new PointF(x, y);
    e.Graphics.DrawLine(SystemPens.ControlText, mp, bp); float qy = 473;
    float qx = -(qy - bp.Y) / k + bp.X; if (qx > 171)
    {
    PointF qp = new PointF(qx, qy);
    e.Graphics.DrawLine(SystemPens.ControlText, bp, qp); float wx = 171;
    float wy = k * (wx - qx) + qy;
    PointF wp = new PointF(wx, wy);
    e.Graphics.DrawLine(SystemPens.ControlText, qp, wp);
    }
    else if (qx < 171)
    {
    float wx = 171;
    float wy = -k * (wx - qx) + qy;
    PointF wp = new PointF(wx, wy); float ty = 473;
    float tx = (ty - wy) / k + wx;
    PointF tp = new PointF(tx, ty); e.Graphics.DrawLine(SystemPens.ControlText, wp, tp); PointF qp = new PointF(qx, qy);
    e.Graphics.DrawLine(SystemPens.ControlText, bp, wp);
    }
    }
    }
    //R--T
    if (mp.Y < op.Y && mp.X > op.X)
    {
    float x = 853;
    float y = (x - mp.X) * k + mp.Y;
    if (y > 145 && y < 473)
    {
    PointF bp = new PointF(x, y);
    e.Graphics.DrawLine(SystemPens.ControlText, mp, bp); float qy = 145;
    float qx = -(qy - bp.Y) / k + bp.X;
    if (qx > 171)
    {
    PointF qp = new PointF(qx, qy);
    e.Graphics.DrawLine(SystemPens.ControlText, bp, qp); float wx = 171;
    float wy = k * (wx - qx) + qy;
    PointF wp = new PointF(wx, wy);
    e.Graphics.DrawLine(SystemPens.ControlText, qp, wp);
    }
    else if (qx < 171)
    {
    float wx = 171;
    float wy = -k * (wx - qx) + qy;
    PointF wp = new PointF(wx, wy); float ty = 145;
    float tx = (ty - wy) / k + wx;
    PointF tp = new PointF(tx, ty); e.Graphics.DrawLine(SystemPens.ControlText, wp, tp); PointF qp = new PointF(qx, qy);
    e.Graphics.DrawLine(SystemPens.ControlText, bp, wp);
    }
    }
    }
    }
    }
    }
    protected override void OnMouseMove(MouseEventArgs e)
    {
    base.OnMouseMove(e);
    if (this.Capture)
    {
    this.Invalidate();
    }
    }
    protected override void OnMouseUp(MouseEventArgs e)
    {
    base.OnMouseUp(e);
    this.Invalidate();
    }
    }
    }
      

  4.   

    gdi+ 本身就提供了不少对图形变换的操作,例如matrix ,transform 
    Rotate
    再结合写图形学的基本原理,非常容易做出来,不太赞成自己死算