已知任意两点,作为椭圆长轴两个端点,又知短轴长度,求生成椭圆代码其实就是先点两下作为长轴,自动生成一个垂直平分线,然后再确定一个短轴端点,由此知道短轴长度。注意是任意角度的,不是水平或垂直的。我这有点代码 但调试出来的椭圆都不太多,总是偏
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
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
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
你知道了长轴的坐标,也知道了短轴的长度,应该就很容易确定绘制区域矩形的左上角和右下角的坐标,知道了后,就可以用:Elipse绘制了。
'定义几个常量和函数
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
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
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
绘制左上角,右下角两点确定的矩形的内切椭圆。
所以需要旋转和平移,才能达到你的目的。利用路径函数,是一种方式,另一种是直接复制图形,旋转图形。
需要做图形图象处理,不然图形质量不好
一种,利用API 画出然后旋转
一种,利用插补算法,或者椭圆的方程画出。