已知任意两点,作为椭圆长轴两个端点,又知短轴长度,求生成椭圆代码其实就是先点两下作为长轴,自动生成一个垂直平分线,然后再确定一个短轴端点,由此知道短轴长度。注意是任意角度的,不是水平或垂直的。我这有点代码 但调试出来的椭圆都不太多,总是偏
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.yx0 = (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

解决方案 »

  1.   

    还有网上找到一个函数,和上一个还不一样两个都不太对,数学不好,请各位给看看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 tEnd Sub
      

  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.   

    简单的例子,在Picture1上画椭圆
    '定义几个常量和函数
    Public Const r_pi = 3.14159265758979 '3.14159265358979323846
    Public Const d_pi = 180
    Function d2r(a As Double) As Double
    d2r = a * r_pi / d_pi
    End FunctionFunction r2d(a As Double) As Double
    r2d = a * d_pi / r_pi
    End FunctionFunction SinD(a As Double) As Double
    SinD = Sin(d2r(a))
    End FunctionFunction CosD(a As Double) As Double
    CosD = Cos(d2r(a))
    End Function'画椭圆
    Private Sub Command1_Click()
    Dim x As Single, y As Single
    Dim x1 As Single, y1 As Single
    Dim a As Single
    Dim b As Double
    Dim alpha As Double
    '
    '椭圆的参数方程
    ' x = a cos (alpha)
    ' y = b sin (alpha)
    '
    '
    Dim beta As DoubleDim theta As Long
    Dim sc As Long
    sc = 8
    For theta = 0 To 360 * sc
    a = 1400
    b = 1200
    beta = 60x0 = 1500
    y0 = 2400alpha = theta * 1#
    x1 = a + a * SinD(alpha / sc)
    y1 = b + b * CosD(alpha / sc)x = x0 + x1 * SinD(beta) + y1 * CosD(beta)
    y = y0 + x1 * CosD(beta) - y1 * SinD(beta)Picture1.PSet (x, y), RGB(200, 100, 100)Next thetaEnd Sub
      

  4.   

    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
      

  5.   

    调用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 LongPublic Declare Function BeginPath Lib "gdi32" (ByVal hdc As Long) As LongPublic Declare Function EndPath Lib "gdi32" (ByVal hdc As Long) As LongPublic 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)EndPath5)‘第一次传递空指针,取得path的数据大小(有多少点)
    GetPath
    6)按照点数分配内存
    7)第二次传递点数组指针,和点种类指针,取得path的数据
    GetPath
    8)。
    旋转坐标,把path的数据的每一个点旋转一下
    利用坐标旋转公式,计算旋转后的坐标
    9)绘制椭圆 
    PolyDrawPS:
    Ellipse API 
    绘制左上角,右下角两点确定的矩形的内切椭圆。
    所以需要旋转和平移,才能达到你的目的。利用路径函数,是一种方式,另一种是直接复制图形,旋转图形。
    需要做图形图象处理,不然图形质量不好
      

  6.   

    因为他要的,不是API画出的那种椭圆,而是任意角度的椭圆有两种方法,可以实现。
    一种,利用API 画出然后旋转
    一种,利用插补算法,或者椭圆的方程画出。