【求助】关于gdi+画过三点弧的问题
vb.net吧
全部回复
仅看楼主
level 12
Lyh🌐oki 楼主
rt,如何在vb.net的gdi+上画过三点弧呢?谢大神!
2014年11月01日 03点11分 1
level 12
方法不知道。我想了个暴力法,先画过两点的弧,然后不断改变弧的高度,判断第三点是否在弧上,可以不绘制,现在位图上比划,确定弧的高度,然后再画。
2014年11月01日 07点11分 2
= =过两点弧我也不会……
2014年11月01日 09点11分
回复 杰克冻人之怒 :是说有半径的过两点弧么
2014年11月01日 09点11分
回复 杰克冻人之怒 :对啊,gdi+画圆弧
2014年11月01日 10点11分
好像叫drawarc
2014年11月01日 10点11分
level 8
先准备3个点的坐标
先判断这三个点在不在一条直线上,具体就是先求出以线段ab为直线的解析式,判断c点在不在该直线上。
然后分别计算线段ab的垂直平分线的解析式,然后再求bc的,然后求其交点,就是圆心,假设a是弧的起点,c是弧的终点(不指定的话会有6种不同的画法),然后用sin()或cos()求其和圆心的夹角,共有16种情况,我还没想好有什么更好的公式,可以用select判断,不会超过70行的,然后知道圆心和其中一个点的坐标,半径也很很好求了,然后就可以用drawarc函数了,应该要4个参数的,圆心坐标,半径,起始点与原点x轴夹角,弧所对圆心角的度数
大概就是这样,算法不是最好的,设计数学的内容比较多,如果要源码我可以写给你
2014年11月01日 13点11分 3
好牛的理论,不过他是个初一的学生诶,你这是想晕死他吗
2014年11月02日 01点11分
回复 刘大王111 :我没有这个意思,我只是想提供一个可行的方案,更好的算法比比皆是,编程有时和数学密不可分,在自己不会的情况下,借用别人的源码或思路并非不是一件好事,仅此而已,其实我自己也只有初三而已.
2014年11月02日 11点11分
回复 杨宇成12345 :sin和cos我都没学过
2014年11月02日 12点11分
回复 杰克冻人之怒 :我也没学,如果不用sin()cos()的话就只能做到过三点画一个圆,过三点画一个圆的函数我已经写好了...就是弧的度数异常难算,我发给你你看看
2014年11月02日 13点11分
level 8
public sub draw(byval a_x as integer,byval a_y as integer,byval b_x as integer,byval b_y as integer,byval c_x as integer,byval c_y as integer)
dim circle_point_x as integer=0
dim circle_point_y as integer=0
dim circle_r as integer=0
dim arc_start_angle as integer=0
dim arc_cross_angle as integer=0
*确定是否在一条直线上
*求ab两点的解析式
dim function_1_k as double=(a_y-b_y)-(a_x-b_x)
dim function_1_b as double=a_y-function_1_k*a_x
if c_y=function_1_k*c_x+function_1_b then
*在同一条直线上没有弧
exit sub
end if
*分别计算ab,bc的垂直平分线的交点
dim high_1 as integer=abs(a_y-b_y)
dim width_1 as integer=abs(a_x-b_x)
dim middle_point_1_x as integer=0
dim middle_point_1_y as integer=0
if a_x<b_x then
middle_point_1_x=a_x+width_1/2
else
middle_point_1_x=b_x+width_1/2
end if
if a_y<b_y then
middle_point_1_y=a_y+high_1/2
else
middle_point_1_y=b_y+high_1/2
end if
dim function_2_k as double=-(1/function_1_k)
dim function_2_b as double=middle_point_1_y-function_2_k*middle_point_1_x
*bc解析式
dim high_2 as integer=abs(c_y-b_y)
dim width_2 as integer=abs(c_x-b_x)
dim middle_point_2_x as integer=0
dim middle_point_2_y as integer=0
if c_x<b_x then
middle_point_2_x=c_x+width_2/2
else
middle_point_2_x=b_x+width_2/2
end if
if c_y<b_y then
middle_point_2_y=c_y+high_2/2
else
middle_point_2_y=b_y+high_2/2
end if
dim function_3_k as double=-(1/(c_y-b_y)-(c_x-b_x))
dim function_3_b as double=middle_point_2_y-function_3_k*middle_point_2_x
*确定圆心
circle_point_x=(function_3_b-function_2_b)/(function_2_k-function_3_k)
circle_point_y=function_2_k*circle_point_x+function_2_b
*求半径
circle_r=sqrt(sqr(abs(circle_point_x-a_x))+sqr(abs(circle_point_y-a_y)))
end sub
circle_point_x和circle_point_y是圆心坐标,circle_r是半径,我只能做到这了[汗]
2014年11月02日 13点11分 4
level 12
Lyh🌐oki 楼主
谢谢大神
2014年11月04日 08点11分 5
1