用C#实现求点坐标,并画矩形,如下:谢谢

「已注销」 2010-08-04 02:13:11
已知一条线段a,其两点坐标分别为(x1,y1)和(x2,y2),另一条线段b垂直于线段a,线段b长度为6,且点(x1,y1)为线段b的中点,另有一线段c平行于b,且c的中点在线段a上,b和c之间距离为10。
考虑线段为平行于x轴或y轴的特殊情况,求线段b的两点坐标(x3,y3)和(x4,y4)以及c的两点坐标(x5,y5)和(x6,y6)?

...全文
696 23 打赏 收藏 转发到动态 举报
写回复
用AI写文章
23 条回复
切换为时间正序
请发表友善的回复…
发表回复
wangyue4 2010-08-05
  • 打赏
  • 举报
回复
步骤:
通过(x1,y1)和(x2,y2)求直线a的参数a,b,c
(x1,y1)在b上,且b和a垂直可求直线b的参数a,b,c。(斜率积为-1,且过(x1,y1),自己试着写写)
有了直线b的参数a,b,c,以(x1,y1)圆心,3为半径可求出线段b的两点坐标(x3,y3)和(x4,y4)
直线c同理
「已注销」 2010-08-05
  • 打赏
  • 举报
回复
带入的直线应该是(x2,y2)和(x3,y3)的连线吧?不是直线a或是b吧?不然怎么会相切呢?
wangyue4 2010-08-05
  • 打赏
  • 举报
回复
不会的,你拿两点式自己算一下。
double k = (pend.Y - pstart.Y) / (pend.X - pstart.X);
double c1 = pend.Y - k * pend.X;
a = k;b = -1; c = c1
pend和pstart是你直线上的两个点。
这个结果k就是斜率,两条直线垂直斜率的积等于-1。你验证一下
「已注销」 2010-08-05
  • 打赏
  • 举报
回复
数学全忘了
「已注销」 2010-08-05
  • 打赏
  • 举报
回复
晕,算出来直线a和b没有垂直阿
wangyue4 2010-08-05
  • 打赏
  • 举报
回复
有直线上的两个点求a,b,c不难吧

pstart和pend是直线上两个点。
double k = (pend.Y - pstart.Y) / (pend.X - pstart.X);
double c1 = pend.Y - k * pend.X;
a = k;b = -1; c = c1;

lz自己应该试着写一写 ^_^
「已注销」 2010-08-05
  • 打赏
  • 举报
回复
那a,b,c怎么求得?谢谢
wangyue4 2010-08-05
  • 打赏
  • 举报
回复
是直线方程ax+by+c=0中的a,b,c。
那个函数是求直线和圆的关系,若相交或相切则求出交点。直线方程:ax+by+c=0
「已注销」 2010-08-05
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 wangyue4 的回复:]
这个思路将lz说的所有可能都解决了,下边是求直线和圆的关系的函数
/// <summary>
/// 求直线和圆的关系,若相交或相切则求出交点。直线方程:ax+by+c=0
/// </summary>
/// <param name="p">圆心</param>
/// <param name="r">半径</param>
/// <param name="a">……
[/Quote]

参数a,b,c是线段a,b,c的斜率吗?
「已注销」 2010-08-05
  • 打赏
  • 举报
回复
谢谢,我搞错了,斜率算错了
「已注销」 2010-08-05
  • 打赏
  • 举报
回复
我的确是按上面作的,但是出来的确实没有垂直,我按这个方法继续找,找到垂直的线了,但是有点麻烦,还是谢谢你了
阿双2009 2010-08-04
  • 打赏
  • 举报
回复
第三种情况比较复杂,提供个思路:
1、先确定线段c与线段a的交点坐标,设为点A(Xac,Yac);
2、确定完点A,便可确定线段b与X轴夹角的正弦值sinα=|x1-Xac|/10;
3、确定完这个夹角正弦值后,便可确定线段b在X轴、Y轴的投影长度,这样便可确定线段b的两点坐标;
4、同理处理线段c的两点坐标
这边有一个式子很好用,即: (sinα)^2+(cosα)^2=1

个人认为还是第一点比较难处理一些,可以这样,以(x1,y1)为圆心,以10为半径作圆得出圆的方程,线段a两点已定,即可知线段a所在直线的直线方程,通过解这个方程组便可求得交点A
qiuxin425 2010-08-04
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 qiuxin425 的回复:]
(x3,y3) = (x1,y1 - 3)
(x4,y4) = (x1,y1 + 3)
(x5,y5) = (x1 + 10,y1 - c/2)
(x6,y6) = (x1 + 10,y1 + c/2)

c没有告知长度
[/Quote]
只是平行x轴情况,如果别的一般情况,按斜率来算,注意垂直x没有斜率呀
wangyue4 2010-08-04
  • 打赏
  • 举报
回复
这个思路将lz说的所有可能都解决了,下边是求直线和圆的关系的函数
/// <summary>
/// 求直线和圆的关系,若相交或相切则求出交点。直线方程:ax+by+c=0
/// </summary>
/// <param name="p">圆心</param>
/// <param name="r">半径</param>
/// <param name="a">直线参数a</param>
/// <param name="b">直线参数b</param>
/// <param name="c">直线参数c</param>
/// <param name="rp1">交点</param>
/// <param name="rp2">交点</param>
/// <returns>0----相离 1----相切 2----相交 </returns>
int clpoint(PointF p, double r, double a, double b, double c, ref PointF rp1, ref PointF rp2)
{
int res = 0;

c = c + a * p.X + b * p.Y;
double tmp;
if (a == 0 && b != 0)
{
tmp = -c / b;
if (r * r < tmp * tmp)
res = 0;
else if (r * r == tmp * tmp)
{
res = 1;
rp1.Y = Convert.ToSingle(tmp);
rp1.X = 0;
}
else
{
res = 2;
rp1.Y = rp2.Y = Convert.ToSingle(tmp);
rp1.X = Convert.ToSingle(Math.Sqrt(r * r - tmp * tmp));
rp2.X = -rp1.X;
}
}
else if (a != 0 && b == 0)
{
tmp = -c / a;
if (r * r < tmp * tmp)
res = 0;
else if (r * r == tmp * tmp)
{
res = 1;
rp1.X = Convert.ToSingle(tmp);
rp1.Y = 0;
}
else
{
res = 2;
rp1.X = rp2.X = Convert.ToSingle(tmp);
rp1.Y = Convert.ToSingle(Math.Sqrt(r * r - tmp * tmp));
rp2.Y = -rp1.Y;
}
}
else if (a != 0 && b != 0)
{
double delta;
delta = b * b * c * c - (a * a + b * b) * (c * c - a * a * r * r);
if (delta < 0)
res = 0;
else if (delta == 0)
{
res = 1;
rp1.Y = Convert.ToSingle(-b * c / (a * a + b * b));
rp1.X = Convert.ToSingle((-c - b * rp1.Y) / a);
}
else
{
res = 2;
rp1.Y = Convert.ToSingle((-b * c + Math.Sqrt(delta)) / (a * a + b * b));
rp2.Y = Convert.ToSingle((-b * c - Math.Sqrt(delta)) / (a * a + b * b));
rp1.X = Convert.ToSingle((-c - b * rp1.Y) / a);
rp2.X = Convert.ToSingle((-c - b * rp2.Y) / a);
}
}
rp1.X += p.X;
rp1.Y += p.Y;
rp2.X += p.X;
rp2.Y += p.Y;
return res;
}
wangyue4 2010-08-04
  • 打赏
  • 举报
回复
本人浅见,如果线段a,b,c都是与x轴,y轴不平行的话应该用自己写一个函数,即求圆和直线交点的函数!
很显然已知(x1,y1)和(x2,y2)=》a的斜率=》b的斜率,由此可求出b的直线参数y=kx+b;再加上(x1,y1)和直线和圆交点函数函数可求出(x3,y3)和(x4,y4),即(x1,y1)为圆心,半径为3求出(x3,y3)和(x4,y4)。同理直线c也可求出
「已注销」 2010-08-04
  • 打赏
  • 举报
回复
应该有3种情况:1=〉a平行于y轴,2=〉a垂直于y轴,3,a任意情况
「已注销」 2010-08-04
  • 打赏
  • 举报
回复
b,c垂直于a的条件是否满足呢?
阿双2009 2010-08-04
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 yans 的回复:]
c的长度和b一样
[/Quote]

既如此,可得线段c的两点坐标为(x1+10,y1-3)和(x1+10,y1+3)
阿双2009 2010-08-04
  • 打赏
  • 举报
回复
假设线段a平行于x轴,则由条件=>
线段b的两点坐标为(x1,y1-3)和(x1,y1+3)

而由于线段c的长度未知,故无法由已知条件得出其两点坐标
「已注销」 2010-08-04
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 qiuxin425 的回复:]
(x3,y3) = (x1,y1 - 3)
(x4,y4) = (x1,y1 + 3)
(x5,y5) = (x1 + 10,y1 - c/2)
(x6,y6) = (x1 + 10,y1 + c/2)

c没有告知长度
[/Quote]

垂直条件好像没满足吧?
加载更多回复(3)

110,538

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧