当前位置:编程学习 > VB >>

已知任意两点,作为椭圆长轴两个端点,又知短轴长度,求生成椭圆代码

已知任意两点,作为椭圆长轴两个端点,又知短轴长度,求生成椭圆代码

其实就是先点两下作为长轴,自动生成一个垂直平分线,然后再确定一个短轴端点,由此知道短轴长度。

注意是任意角度的,不是水平或垂直的。

我这有点代码 但调试出来的椭圆都不太多,总是偏


Private Sub drawC(objName As Object, p1 As point, p2 As point, b As Single)
'input x1,x2,y1,y2,b 长轴直线端点、短半轴长度
Dim x1 As Single
Dim x2 As Single
Dim y1 As Single
Dim y2 As Single
Dim x0 As Single '中心
Dim y0 As Single '中心
Dim a As Single '长轴一半
Dim k1 As Single '斜率
Dim θ As Single '角度
Dim temp As point


x1 = p1.x
x2 = p2.x
y1 = p1.y
y2 = p2.y

x0 = (x1 + x2) / 2 '定位点
y0 = (y1 + y2) / 2


If x1 = x2 Then 'θ=pi/2或3pi/2
   a = (Abs(y1 - y2)) / 2
   x0 = x1
   y0 = 0.5 * (y1 + y2)
   For i = 1 To 360 Step 1
   objName.Circle (x0, y0), a, QBColor(12), Arc * (i - 1), Arc * 1, (a / b)
   Next i
   Exit Sub
 End If
   
   k1 = (y2 - y1) / (x2 - x1)
   θ = 180 * Atn((y2 - y1) / (x2 - x1)) / 3.1415926
   a = Sqr((x2 - x1) ^ 2 + (y2 - y1) ^ 2) / 2
   n = 100 '2pi周期内的等分数
   dt = 2 * 3.1415926 / n
    t = 0
    If Tan(θ) > 0 Then '0<θ<pi/2 或 pi<θ<3pi/2
      CurrentX = 0.5 * (x1 + x2) + b * k1 / Sqr(k1 ^ 2 + 1)
      CurrentY = 0.5 * (y1 + y2) + b / Sqr(k1 ^ 2 + 1)
    ElseIf Tan(θ) < 0 Then 'pi/2<θ<pi 或 3pi/2<θ<2pi
      CurrentX = 0.5 * (x1 + x2) - b * k1 / Sqr(k1 ^ 2 + 1)
      CurrentY = 0.5 * (y1 + y2) - b / Sqr(k1 ^ 2 + 1)
    Else    'Y1=Y2,θ=0 or pi or 2pi
      CurrentX = 0.5 * (x1 + x2)
      CurrentY = 0.5 * (y1 + y2)
    End If
    objName.PSet (CurrentX, CurrentY), vbRed
    'objName.PSet (x0, y0), vbYallow
    For j = 0 To n
        temp.x = x0 + a * Cos(θ) * Sin(t) - b * Sin(θ) * Cos(t)
        temp.y = y0 + a * Sin(θ) * Sin(t) - b * Cos(θ) * Cos(t)
      objName.Line -(temp.x, temp.y), QBColor(12)
      t = t + dt
     Next j
            
End Sub
椭圆 --------------------编程问答-------------------- 还有网上找到一个函数,和上一个还不一样两个都不太对,数学不好,请各位给看看

Private Sub drawC2(objName As Object, x As Single, y As Single, a As Single, b As Single, c As Single, petColor As OLE_COLOR, d As Integer)
Dim t As Double
Dim tempx As Single
Dim tempy As Single
Dim x1 As Single
Dim y1 As Single
Dim c1 As Single
objName.DrawWidth = d
c1 = -Atn(1) / 45 * c
For t = -3.1415926535 To 3.1415926535 Step 0.003
    tempx = Cos(t) * a
    tempy = Sin(t) * b
    x1 = x + tempx * Cos(c1) - tempy * Sin(c1)
    y1 = y + tempx * Sin(c1) + tempy * Cos(c1)
    objName.PSet (x1, y1), petColor
Next t

End Sub
--------------------编程问答-------------------- 1)
画椭圆,然后平移,旋转,椭圆图像
2)
 写出椭圆方程,平移,旋转,得到新椭圆方程,然后自己做插补算法,画出椭圆。
  --------------------编程问答-------------------- Private Declare Function Ellipse Lib "gdi32" (ByVal hdc As Long, ByVal X1 As Long, ByVal Y1 As Long, ByVal X2 As Long, ByVal Y2 As Long) As Long


你知道了长轴的坐标,也知道了短轴的长度,应该就很容易确定绘制区域矩形的左上角和右下角的坐标,知道了后,就可以用:Elipse绘制了。 --------------------编程问答-------------------- --------------------编程问答-------------------- 3楼。
Private Declare Function Ellipse Lib "gdi32" (ByVal hdc As Long, ByVal X1 As Long, ByVal Y1 As Long, ByVal X2 As Long, ByVal Y2 As Long) As Long
Private Sub Command1_Click()
Ellipse Picture1.hdc, 500, 0, 0, 300
End Sub
--------------------编程问答-------------------- 调用API 绘制 长短轴不在坐标轴方向上的椭圆,需要做以下处理 
1)坐标平移和旋转这个必须掌握
2)Ellipse 绘图
3)要使用 path  保存绘图参数,以便旋转坐标
4)把旋转后的path绘制出来
要用到以下几个API 

Public Declare Function Ellipse Lib "gdi32" (ByVal hdc As Long, ByVal x1 As Long, ByVal y1 As Long, ByVal X2 As Long, ByVal Y2 As Long) As Long

Public Declare Function BeginPath Lib "gdi32" (ByVal hdc As Long) As Long

Public Declare Function EndPath Lib "gdi32" (ByVal hdc As Long) As Long

Public Declare Function PolyDraw Lib "gdi32" (ByVal hdc As Long, lppt As pointapi, lpbTypes As Byte, ByVal cCount As Long) As Long
Public Declare Function GetPath Lib "gdi32" (ByVal hdc As Long, ByVal lpPoint As Long, ByVal lpTypes As Long, ByVal nSize As Long) As Long
'不能传递NULL指针,获得数据大小,所以需要修改
'Public Declare Function GetPath Lib "gdi32" (ByVal hdc As Long, lpPoint As POINTAPI, lpTypes As Byte, ByVal nSize As Long) As Long

步骤
1)计算长短轴长度,给定两点中点坐标,旋转角度
   利用中点坐标 计算旋转前,椭圆外切矩形的顶点。(lefttop,rightbottom)
 
2)BeginPath
3)Ellipse
4)EndPath

5)‘第一次传递空指针,取得path的数据大小(有多少点)
GetPath
6)按照点数分配内存
7)第二次传递点数组指针,和点种类指针,取得path的数据
GetPath
8)。。。。
旋转坐标,把path的数据的每一个点旋转一下
利用坐标旋转公式,计算旋转后的坐标
9)绘制椭圆 
PolyDraw

PS:
Ellipse API 
绘制左上角,右下角两点确定的矩形的内切椭圆。
所以需要旋转和平移,才能达到你的目的。

利用路径函数,是一种方式,另一种是直接复制图形,旋转图形。
需要做图形图象处理,不然图形质量不好

--------------------编程问答-------------------- 要这么复杂吗?按理一二句话不就实现了? --------------------编程问答--------------------
引用 7 楼 xiaoyao961 的回复:
要这么复杂吗?按理一二句话不就实现了?

因为他要的,不是API画出的那种椭圆,而是任意角度的椭圆

有两种方法,可以实现。
一种,利用API 画出然后旋转
一种,利用插补算法,或者椭圆的方程画出。
补充:VB ,  基础类
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,