C#如何实现在一个矩形框内四次反射 假如一个坐标分别为A(171,145),B(853,145),C(853,473),D(171,473)组成的矩形,在矩形中任意指定一点O,鼠标P在矩形框中移动时自动生成以OP为最初入射线矩形边为水平面的反射线PQ,然后再以PQ为入射线,以此类推,实现四次以上的反射线条,请问如何实现?分不够再加,希望高手指点注意:O点是任意指定的,P是随鼠标移动动态变化的,生成线条也是动态变化的 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 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));得到正弦值以后,就可以根据这个值来计算其他点了。角度动态变化,这个值也可以动态计算。很抱歉,没有时间写完整的代码。 终于写出一个半成品,只画出了三次反射。不过感觉应该有更好的方法,希望有人改一下哈: 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); } } } 接上: //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(); } }} gdi+ 本身就提供了不少对图形变换的操作,例如matrix ,transform Rotate再结合写图形学的基本原理,非常容易做出来,不太赞成自己死算 弹出DIV问题 C# 写2进制文件 请高手救急 关于Parameters的问题~求助!! .NET 连接 SAS 数 据 库 文 件 时 的 密 钥 在 连 接 串 里 怎 么 写 ? c# winform 如何实现textbox的宽度动态变化? VS 2003,Datagrid(WinForm)中,关于鼠标滚轮的问题 大家看看这个控件用WPF是怎么实现的? 请问如何把文本文件中的信息提取出来存入数据库? 大家好!我想问一下初学习C#的时候应该拿什么书做参考 对数据库查询的问题,请各位帮忙! 问一初级问题? 在线等 datagridview如何让列标题居中及列隐藏
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));得到正弦值以后,就可以根据这个值来计算其他点了。
角度动态变化,这个值也可以动态计算。
很抱歉,没有时间写完整的代码。
{
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);
}
}
}
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();
}
}
}
Rotate
再结合写图形学的基本原理,非常容易做出来,不太赞成自己死算