读书人

请能帮小弟我将曲线按比例缩小已有坐

发布时间: 2012-01-19 00:22:27 作者: rapoo

请能帮我将曲线按比例缩小,已有坐标!
请问,怎么把面的这个曲线按比例缩小5倍呀!我自己试了一下,可不不成功!我之前的想法是每个坐标都除于5,但是效果不好!

VB code
Private Declare Function Polyline Lib "gdi32" (ByVal hdc As Long, lpPoint As POINTAPI, ByVal nCount As Long) As LongPrivate Declare Function CreatePen Lib "gdi32" (ByVal nPenStyle As Long, ByVal nWidth As Long, ByVal crColor As Long) As LongPrivate Declare Function SelectObject Lib "gdi32" (ByVal hdc As Long, ByVal hObject As Long) As LongPrivate Type POINTAPI   X As Long   Y As LongEnd TypePrivate Sub Command1_Click()Dim A(38) As POINTAPIA(0).X = 88: A(0).Y = 335A(1).X = 112: A(1).Y = 312A(2).X = 135: A(2).Y = 290A(3).X = 158: A(3).Y = 270A(4).X = 182: A(4).Y = 250A(5).X = 205: A(5).Y = 232A(6).X = 227: A(6).Y = 215A(7).X = 250: A(7).Y = 200A(8).X = 272: A(8).Y = 186A(9).X = 295: A(9).Y = 173A(10).X = 317: A(10).Y = 161A(11).X = 338: A(11).Y = 150A(12).X = 360: A(12).Y = 141A(13).X = 382: A(13).Y = 132A(14).X = 403: A(14).Y = 125A(15).X = 424: A(15).Y = 119A(16).X = 445: A(16).Y = 114A(17).X = 466: A(17).Y = 111A(18).X = 487: A(18).Y = 108A(19).X = 508: A(19).Y = 107A(20).X = 528: A(20).Y = 106A(21).X = 548: A(21).Y = 107A(22).X = 568: A(22).Y = 109A(23).X = 588: A(23).Y = 112A(24).X = 608: A(24).Y = 116A(25).X = 628: A(25).Y = 121A(26).X = 647: A(26).Y = 127A(27).X = 666: A(27).Y = 135A(28).X = 686: A(28).Y = 143A(29).X = 705: A(29).Y = 152A(30).X = 723: A(30).Y = 163A(31).X = 742: A(31).Y = 174A(32).X = 761: A(32).Y = 187A(33).X = 779: A(33).Y = 200A(34).X = 797: A(34).Y = 215A(35).X = 816: A(35).Y = 230A(36).X = 834: A(36).Y = 246A(37).X = 851: A(37).Y = 264A(38).X = 869: A(38).Y = 282hPen = CreatePen(0, 3, RGB(255, 0, 0))SelectObject Me.hdc, hPenPolyline Me.hdc, A(0), 38 '画三角形End SubPrivate Sub Form_Load()   Me.Width = 900 * 15Me.Height = 500 * 15End Sub


[解决办法]
建议改变思路,使用PictureBox对象来绘制

看看这个:
VB code
Option ExplicitPrivate Type POINTAPI   X As Long   Y As LongEnd TypeDim A(38) As POINTAPIDim lngTopX As LongDim lngTopY As LongDim lngBottomX As LongDim 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 intPEnd 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 intPEnd 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 intPEnd 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 


[解决办法]
现在你的坐标默认中心是(0,0), 所以你可以直接把坐标值缩小5倍, 但是曲线距离中心点的距离也缩小了5倍
就是跑到左上角了.

我们假定一个任意中心坐标(A,B).

那么你的初始坐标(X1,Y1)坐标缩小重定位后对应的坐标(X2,Y2)是:

X2= A+(X1-A)/5
Y2= B+(Y2-B)/5

这下会了没? 公式给你了,要是再不会就没话说了.
[解决办法]

探讨
效果不好是因为图像原点在左上角, 你缩小所有坐标之后整个图像跑到左上角去了对不.

你得先计算出整个图像的X和Y中点, 然后将每对坐标相对中点坐标的DX,DY差值缩小然后再加上中点坐标重新画一遍.

解析几何里面这个很简单吧,初中数学好好回忆一下吧.

读书人网 >VB

热点推荐