请问,怎么把面的这个曲线按比例缩小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

解决方案 »

  1.   

    效果不好是因为图像原点在左上角, 你缩小所有坐标之后整个图像跑到左上角去了对不.你得先计算出整个图像的X和Y中点, 然后将每对坐标相对中点坐标的DX,DY差值缩小然后再加上中点坐标重新画一遍.解析几何里面这个很简单吧,初中数学好好回忆一下吧.
      

  2.   

    建议改变思路,使用PictureBox对象来绘制看看这个:Option ExplicitPrivate Type POINTAPI
       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
      

  3.   

    现在你的坐标默认中心是(0,0), 所以你可以直接把坐标值缩小5倍, 但是曲线距离中心点的距离也缩小了5倍
    就是跑到左上角了.我们假定一个任意中心坐标(A,B).那么你的初始坐标(X1,Y1)坐标缩小重定位后对应的坐标(X2,Y2)是:X2= A+(X1-A)/5
    Y2= B+(Y2-B)/5这下会了没? 公式给你了,要是再不会就没话说了.
      

  4.   


    假设坐标原点为(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
      

  5.   

    Visual Basic 6.0计算机绘图教程