请问,怎么把面的这个曲线按比例缩小5倍呀!我自己试了一下,可不不成功!我之前的想法是每个坐标都除于5,但是效果不好!
Private Declare Function Polyline Lib "gdi32" (ByVal hdc As Long, lpPoint As POINTAPI, ByVal nCount As Long) As Long
Private Declare Function CreatePen Lib "gdi32" (ByVal nPenStyle As Long, ByVal nWidth As Long, ByVal crColor As Long) As Long
Private Declare Function SelectObject Lib "gdi32" (ByVal hdc As Long, ByVal hObject As Long) As LongPrivate Type POINTAPI
X As Long
Y As Long
End TypePrivate Sub Command1_Click()Dim A(38) As POINTAPI
A(0).X = 88: A(0).Y = 335
A(1).X = 112: A(1).Y = 312
A(2).X = 135: A(2).Y = 290
A(3).X = 158: A(3).Y = 270
A(4).X = 182: A(4).Y = 250
A(5).X = 205: A(5).Y = 232
A(6).X = 227: A(6).Y = 215
A(7).X = 250: A(7).Y = 200
A(8).X = 272: A(8).Y = 186
A(9).X = 295: A(9).Y = 173
A(10).X = 317: A(10).Y = 161
A(11).X = 338: A(11).Y = 150
A(12).X = 360: A(12).Y = 141
A(13).X = 382: A(13).Y = 132
A(14).X = 403: A(14).Y = 125
A(15).X = 424: A(15).Y = 119
A(16).X = 445: A(16).Y = 114
A(17).X = 466: A(17).Y = 111
A(18).X = 487: A(18).Y = 108
A(19).X = 508: A(19).Y = 107
A(20).X = 528: A(20).Y = 106
A(21).X = 548: A(21).Y = 107
A(22).X = 568: A(22).Y = 109
A(23).X = 588: A(23).Y = 112
A(24).X = 608: A(24).Y = 116
A(25).X = 628: A(25).Y = 121
A(26).X = 647: A(26).Y = 127
A(27).X = 666: A(27).Y = 135
A(28).X = 686: A(28).Y = 143
A(29).X = 705: A(29).Y = 152
A(30).X = 723: A(30).Y = 163
A(31).X = 742: A(31).Y = 174
A(32).X = 761: A(32).Y = 187
A(33).X = 779: A(33).Y = 200
A(34).X = 797: A(34).Y = 215
A(35).X = 816: A(35).Y = 230
A(36).X = 834: A(36).Y = 246
A(37).X = 851: A(37).Y = 264
A(38).X = 869: A(38).Y = 282hPen = CreatePen(0, 3, RGB(255, 0, 0))
SelectObject Me.hdc, hPen
Polyline Me.hdc, A(0), 38 '画三角形End Sub
Private Sub Form_Load()
Me.Width = 900 * 15
Me.Height = 500 * 15
End Sub
Private Declare Function Polyline Lib "gdi32" (ByVal hdc As Long, lpPoint As POINTAPI, ByVal nCount As Long) As Long
Private Declare Function CreatePen Lib "gdi32" (ByVal nPenStyle As Long, ByVal nWidth As Long, ByVal crColor As Long) As Long
Private Declare Function SelectObject Lib "gdi32" (ByVal hdc As Long, ByVal hObject As Long) As LongPrivate Type POINTAPI
X As Long
Y As Long
End TypePrivate Sub Command1_Click()Dim A(38) As POINTAPI
A(0).X = 88: A(0).Y = 335
A(1).X = 112: A(1).Y = 312
A(2).X = 135: A(2).Y = 290
A(3).X = 158: A(3).Y = 270
A(4).X = 182: A(4).Y = 250
A(5).X = 205: A(5).Y = 232
A(6).X = 227: A(6).Y = 215
A(7).X = 250: A(7).Y = 200
A(8).X = 272: A(8).Y = 186
A(9).X = 295: A(9).Y = 173
A(10).X = 317: A(10).Y = 161
A(11).X = 338: A(11).Y = 150
A(12).X = 360: A(12).Y = 141
A(13).X = 382: A(13).Y = 132
A(14).X = 403: A(14).Y = 125
A(15).X = 424: A(15).Y = 119
A(16).X = 445: A(16).Y = 114
A(17).X = 466: A(17).Y = 111
A(18).X = 487: A(18).Y = 108
A(19).X = 508: A(19).Y = 107
A(20).X = 528: A(20).Y = 106
A(21).X = 548: A(21).Y = 107
A(22).X = 568: A(22).Y = 109
A(23).X = 588: A(23).Y = 112
A(24).X = 608: A(24).Y = 116
A(25).X = 628: A(25).Y = 121
A(26).X = 647: A(26).Y = 127
A(27).X = 666: A(27).Y = 135
A(28).X = 686: A(28).Y = 143
A(29).X = 705: A(29).Y = 152
A(30).X = 723: A(30).Y = 163
A(31).X = 742: A(31).Y = 174
A(32).X = 761: A(32).Y = 187
A(33).X = 779: A(33).Y = 200
A(34).X = 797: A(34).Y = 215
A(35).X = 816: A(35).Y = 230
A(36).X = 834: A(36).Y = 246
A(37).X = 851: A(37).Y = 264
A(38).X = 869: A(38).Y = 282hPen = CreatePen(0, 3, RGB(255, 0, 0))
SelectObject Me.hdc, hPen
Polyline Me.hdc, A(0), 38 '画三角形End Sub
Private Sub Form_Load()
Me.Width = 900 * 15
Me.Height = 500 * 15
End Sub
X As Long
Y As Long
End Type
Dim A(38) As POINTAPI
Dim lngTopX As Long
Dim lngTopY As Long
Dim lngBottomX As Long
Dim lngBottomY As Long
'原始比例绘制曲线
Private Sub Command1_Click()
Dim intP As Integer
Picture1.AutoRedraw = True
Picture1.ScaleMode = vbPixels
Picture1.DrawMode = 13
lngTopX = -1
lngTopY = 400
lngBottomX = 900
lngBottomY = -1
Picture1.Scale (lngTopX, lngTopY)-(lngBottomX, lngBottomY) '定义坐标系统
For intP = LBound(A) To UBound(A) - 1
Picture1.Line (A(intP).X, A(intP).Y)-(A(intP + 1).X, A(intP + 1).Y)
Next intP
End Sub
'缩小5倍显示
Private Sub Command2_Click()
Dim intP As Integer
Picture1.Cls
Picture1.AutoRedraw = True
Picture1.ScaleMode = vbPixels
Picture1.DrawMode = 13
lngTopX = lngTopX * 5
lngTopY = lngTopY * 5
lngBottomX = lngBottomX * 5
lngBottomY = lngBottomY * 5
Picture1.Scale (lngTopX, lngTopY)-(lngBottomX, lngBottomY) '定义坐标系统
For intP = LBound(A) To UBound(A) - 1
Picture1.Line (A(intP).X, A(intP).Y)-(A(intP + 1).X, A(intP + 1).Y)
Next intP
End Sub
'放大5倍显示
Private Sub Command3_Click()
Dim intP As Integer
Picture1.Cls
Picture1.AutoRedraw = True
Picture1.ScaleMode = vbPixels
Picture1.DrawMode = 13
lngTopX = lngTopX / 5
lngTopY = lngTopY / 5
lngBottomX = lngBottomX / 5
lngBottomY = lngBottomY / 5
Picture1.Scale (lngTopX, lngTopY)-(lngBottomX, lngBottomY) '定义坐标系统
For intP = LBound(A) To UBound(A) - 1
Picture1.Line (A(intP).X, A(intP).Y)-(A(intP + 1).X, A(intP + 1).Y)
Next intP
End SubPrivate Sub Form_Load()
A(0).X = 88: A(0).Y = 335
A(1).X = 112: A(1).Y = 312
A(2).X = 135: A(2).Y = 290
A(3).X = 158: A(3).Y = 270
A(4).X = 182: A(4).Y = 250
A(5).X = 205: A(5).Y = 232
A(6).X = 227: A(6).Y = 215
A(7).X = 250: A(7).Y = 200
A(8).X = 272: A(8).Y = 186
A(9).X = 295: A(9).Y = 173
A(10).X = 317: A(10).Y = 161
A(11).X = 338: A(11).Y = 150
A(12).X = 360: A(12).Y = 141
A(13).X = 382: A(13).Y = 132
A(14).X = 403: A(14).Y = 125
A(15).X = 424: A(15).Y = 119
A(16).X = 445: A(16).Y = 114
A(17).X = 466: A(17).Y = 111
A(18).X = 487: A(18).Y = 108
A(19).X = 508: A(19).Y = 107
A(20).X = 528: A(20).Y = 106
A(21).X = 548: A(21).Y = 107
A(22).X = 568: A(22).Y = 109
A(23).X = 588: A(23).Y = 112
A(24).X = 608: A(24).Y = 116
A(25).X = 628: A(25).Y = 121
A(26).X = 647: A(26).Y = 127
A(27).X = 666: A(27).Y = 135
A(28).X = 686: A(28).Y = 143
A(29).X = 705: A(29).Y = 152
A(30).X = 723: A(30).Y = 163
A(31).X = 742: A(31).Y = 174
A(32).X = 761: A(32).Y = 187
A(33).X = 779: A(33).Y = 200
A(34).X = 797: A(34).Y = 215
A(35).X = 816: A(35).Y = 230
A(36).X = 834: A(36).Y = 246
A(37).X = 851: A(37).Y = 264
A(38).X = 869: A(38).Y = 282
End Sub
就是跑到左上角了.我们假定一个任意中心坐标(A,B).那么你的初始坐标(X1,Y1)坐标缩小重定位后对应的坐标(X2,Y2)是:X2= A+(X1-A)/5
Y2= B+(Y2-B)/5这下会了没? 公式给你了,要是再不会就没话说了.
假设坐标原点为(x0,y0)
如果纯粹压缩图像比例,一般可以只压缩y坐标,不用压缩x坐标,因此,可以分开控制(类似于示波器)
以下是压缩函数,你可以使用返回的数组绘画:'注意不能使用Public定义,因为Public定义不能使用UDT数据类型传递数据,及作为返回值
Private Function Compress(A() As POINTAPI, oP As POINTAPI, yR As Single, Optional xR As Single = 1) As POINTAPI()
'A():原始数组点坐标
'op:坐标原点
'yR:y轴缩放系数 ,大于1放大,小于1缩小
'xR:x轴缩放系数
Dim B() As POINTAPI
Dim u As Long
Dim i As Long
u = UBound(A)
ReDim B(u)
For i = 0 To u
B(i).x = (A(i).x - oP.x) * xR
B(i).y = (A(i).y - oP.y) * yR
Next
Compress = B
End Function调用位置:
Private Sub Command2_Click()
'假设oP已经在模块级定义并赋值
dim B() pointapi
xr=1
yr=5
B = Compress(A, oP, yR, xR) PolyLine hDC,B(0),Ubound(b)+1
End Sub