vb中如何判断一个点在面内、面外?
有可用的现成函数可以借用吗?
或者需要引用什么类库?

解决方案 »

  1.   

    api: PtInRect  点在矩形内
           PtInRxgxxx    点在区域内
           ptinxxx 系列
      

  2.   

    看看这种方法
    http://blog.csdn.net/SupermanKing/archive/2010/04/28/5538059.aspx
      

  3.   

    2 楼正解,系统API PtIn* 系列函数是最简便实现点在区域内的判断的办法。如果想自己写函数,参考这样一个思想:基本检测:由测试点,向任意方向引一条射线,如果在多边形内则必然与其至少一条边相交。改进检测:由测试点,向任意方向引一条射线,如果与多边形的边相交次数为奇数,则在多边形内,如果为偶数则在多边形之外。(该方法还适用于有中空的多边形)射线与多边形边的检测就简单了,中学几何中有讲解(判断两条线的斜率)。
      

  4.   

    PtInRxgxxx  点在区域内
    请问具体是那个函数名??
      

  5.   

    Private Declare Function PtInRect Lib "user32" (lpRect As RECT, pt As POINTAPI) As Long
      

  6.   

    API浏览器里这个声明是错误的
      

  7.   

    给你写了个示例代码,窗体只放一个TIMER即可
    Private Type POINTAPI
            x As Long
            y As Long
    End Type
    Private Type RECT
            Left As Long
            Top As Long
            Right As Long
            Bottom As Long
    End Type
    Private Declare Function GetWindowRect Lib "user32" (ByVal hwnd As Long, lpRect As RECT) As Long
    Private Declare Function GetCursorPos Lib "user32" (lpPoint As POINTAPI) As Long
    Private Declare Function PtInRect Lib "user32" (lpRect As RECT, ByVal x As Long, ByVal y As Long) As Long 'API浏览器那里面的那个声明是错误的
    Private Sub Form_Load()
        Timer1.Interval = 100
    End SubPrivate Sub Timer1_Timer()
        Dim M As POINTAPI
        GetCursorPos M
        Dim R As RECT
        GetWindowRect Me.hwnd, R
        If PtInRect(R, M.x, M.y) <> 0 Then
            Me.Caption = "鼠标在窗体内"
        Else
            Me.Caption = "鼠标在窗体外"
        End If
    End Sub
      

  8.   

    如果是判断鼠标在窗体的某个区域内用API函数PtInRegion
      

  9.   

    看这里
    http://hi.baidu.com/hnsoft/blog/item/bcd48a6451333df8f73654d9.html
      

  10.   

    Private Type POINTAPI
        X As Long
        Y As Long
    End Type
    Private Type DIAMOND
        X As Long   '起始x坐标
        Y As Long   '起始y坐标
        CX As Long '中点
        CY As Long '中点
        W As Long   '宽度
        H As Long   '高度
        mX As Long '位移x
        mY As Long '位移y
    End TypePrivate Declare Function PtInRegion Lib "gdi32" (ByVal hRgn As Long, ByVal X As Long, ByVal Y As Long) As Long
    Private Declare Function DeleteObject Lib "gdi32" (ByVal hObject As Long) As Long
    Private Declare Function CreatePolygonRgn Lib "gdi32" (lpPoint As POINTAPI, ByVal nCount As Long, ByVal nPolyFillMode As Long) As Long
    Private Declare Function FillRgn Lib "gdi32" (ByVal hdc As Long, ByVal hRgn As Long, ByVal hBrush As Long) As Long
    Private Declare Function CreateSolidBrush Lib "gdi32" (ByVal crColor As Long) As Long
    Dim rDmd As DIAMONDPrivate Sub Form_Load()
         Me.ScaleMode = 3
        '初始化
         With rDmd
            .X = 0
            .Y = 0
            .CX = 32
            .CY = 16
            .H = 32
            .W = 64
            .mX = 51
            .mY = 18
        End With
    End SubPrivate Sub Form_MouseMove(Button As Integer, Shift As Integer, X As Single, Y As Single)
        Dim SP(4) As POINTAPI
        Dim hRgn As Long, hIn As Long, hBrush As Long
        '设置菱形数据
        With rDmd
            '左点
            SP(0).X = .mX
            SP(0).Y = .mY + .CY
            '顶点
            SP(1).X = .mX + .CX
            SP(1).Y = .mY
            '右点
            SP(2).X = .mX + .W
            SP(2).Y = .mY + .CY
            '底点
            SP(3).X = .mX + .CX
            SP(3).Y = .mY + .H
            '合并到左点
            SP(4) = SP(0)
        End With
        '创建菱形范围
        hRgn = CreatePolygonRgn(SP(0), 4, 1)'    '画菱形,视觉测试---------------------------------
        hBrush = CreateSolidBrush(RGB(100, 0, 0))
        If hRgn Then
            Call FillRgn(Me.hdc, hRgn, hBrush)
            DeleteObject hBrush
        End If    '判断鼠标是否在菱形内
        hIn = PtInRegion(hRgn, X, Y)
        If hIn <> 0 Then
            Me.Caption = "鼠标在菱形内"
        Else
            Me.Caption = "鼠标在菱形外"
        End If
        '删除对象
        DeleteObject hRgn
        DeleteObject hIn
    End Sub
      

  11.   

    关于设置数据这里不是很明白
     '左点
            SP(0).X = 200 '.mX
            SP(0).Y = 200 '.mY + .CY
            '顶点
            SP(1).X = 100 '.mX + .CX
            SP(1).Y = 100 '.mY
            '右点
            SP(2).X = 320 '.mX + .W
            SP(2).Y = 320 '.mY + .CY
            '底点
            SP(3).X = 600 '.mX + .CX
            SP(3).Y = 600 '.mY + .H直接设置这个问什么画得看不到??