已知任意兩點,作為橢圓長軸兩個端點,又知短軸長度,求生成橢圓代碼
其實就是先點兩下作為長軸,自動生成一個垂直平分線,然后再確定一個短軸端點,由此知道短軸長度。
注意是任意角度的,不是水平或垂直的。
我這有點代碼 但除錯出來的橢圓都不太多,總是偏
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
uj5u.com熱心網友回復:
還有網上找到一個函式,和上一個還不一樣兩個都不太對,數學不好,請各位給看看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
uj5u.com熱心網友回復:
1)畫橢圓,然后平移,旋轉,橢圓影像
2)
寫出橢圓方程,平移,旋轉,得到新橢圓方程,然后自己做插補演算法,畫出橢圓。
uj5u.com熱心網友回復:
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繪制了。
uj5u.com熱心網友回復:
簡單的例子,在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 Function
Function r2d(a As Double) As Double
r2d = a * d_pi / r_pi
End Function
Function SinD(a As Double) As Double
SinD = Sin(d2r(a))
End Function
Function 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 Double
Dim theta As Long
Dim sc As Long
sc = 8
For theta = 0 To 360 * sc
a = 1400
b = 1200
beta = 60
x0 = 1500
y0 = 2400
alpha = 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 theta
End Sub
uj5u.com熱心網友回復:
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
uj5u.com熱心網友回復:
呼叫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
繪制左上角,右下角兩點確定的矩形的內切橢圓。
所以需要旋轉和平移,才能達到你的目的。
利用路徑函式,是一種方式,另一種是直接復制圖形,旋轉圖形。
需要做圖形圖象處理,不然圖形質量不好
uj5u.com熱心網友回復:
要這么復雜嗎?按理一二句話不就實作了?uj5u.com熱心網友回復:
因為他要的,不是API畫出的那種橢圓,而是任意角度的橢圓
有兩種方法,可以實作。
一種,利用API 畫出然后旋轉
一種,利用插補演算法,或者橢圓的方程畫出。
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/139706.html
標籤:VB基礎類
上一篇:VB6呼叫DLL問題
