凸多角形内部点列挙の実行

Namespace: fvalgcli
Assembly: fvalgcli (in fvalgcli.dll) Version: 3.1.0.0 (3.1.0.11)

Syntax

C#
public static int fnFIE_cg_points_in_convex_polygon(
	PNT_T_PTR vrtx,
	int vrtx_num,
	PNT_T_PTR pnts,
	int pnt_num,
	int bndry_flag,
	ref INT_PTR ans_pnt_no,
	ref int ans_pnt_num
)
Visual Basic
Public Shared Function fnFIE_cg_points_in_convex_polygon ( 
	vrtx As PNT_T_PTR,
	vrtx_num As Integer,
	pnts As PNT_T_PTR,
	pnt_num As Integer,
	bndry_flag As Integer,
	ByRef ans_pnt_no As INT_PTR,
	ByRef ans_pnt_num As Integer
) As Integer

Parameters

vrtx
Type: fvalgcli..::..PNT_T_PTR
凸多角形の頂点列
vrtx_num
Type: System..::..Int32
多角形の頂点数( vrtx の要素数)
pnts
Type: fvalgcli..::..PNT_T_PTR
内部点を判定する点集合 このデータは順序データで有る必要はなく、また重複点が合ってもかまわない
pnt_num
Type: System..::..Int32
点集合の点の数( pnts の要素数)
bndry_flag
Type: System..::..Int32
境界フラグ
  • ON 境界上の点を内部の点として回答に含める
  • OFF 境界上の点は外部の点として、回答に含めない
ans_pnt_no
Type: fvalgcli..::..INT_PTR%
内部にある点の番号列の先頭ポインタ。 ここでの番号とは、配列 pnts での要素番号を指す。IntPtr.Zero で初期化してください。
ans_pnt_num
Type: System..::..Int32%
内部点の数

Return Value

Type: Int32
以下のエラーコードを返します。

エラーコード:
f_err内容
F_ERR_NONE正常終了
F_ERR_INVALID_PARAM 不正なパラメータが渡された
F_ERR_NOMEMORYメモリ不足
F_ERR_CALC_IMPOSSIBLE 頂点列が凸多角形ではないため、計算不能(頂点数が3以上の場合)
F_ERR_NO_LICENCEライセンスエラー、または未初期化エラー

Remarks

Examples

C# Copy imageCopy
//    $Revision: 1.1 $
#define BNDRY_ON

using System;
using System.Collections.Generic;
using System.Text;
using fvalgcli;

namespace TC
{
    public partial class FIE
    {
        [FvPluginExecute]
        public void fnFIE_cg_points_in_convex_polygon()
        {
            int status = (int)f_err.F_ERR_NONE;

            PNT_T_PTR vrtx = IntPtr.Zero;        // [in] 凸多角形の頂点列.
            int vrtx_num = 0;                    // [in] 多角形の頂点数( vrtx の要素数).
            PNT_T_PTR pnts = IntPtr.Zero;        // [in] 内部点を判定する点集合.
            int pnt_num = 0;                    // [in] 点集合の点の数( pnts の要素数).
            int bndry_flag = 0;                    // [in] 境界フラグ(境界上の点を内部の点として回答に ... 1:含める, 0:含めない).
            INT_PTR ans_pnt_no = INT_PTR.Zero;    // [out] 内部にある点の番号(pnts での要素番号)列の先頭ポインタ.
            int ans_pnt_num = 0;                // [out] 内部点の数.

            try
            {
                // 凸多角形の頂点列を確保、設定する.
                const int min = 5;
                const int max = 15;

                vrtx_num = 4;
                vrtx = PNT_T_PTR.alloc(vrtx_num);
                vrtx[0] = PNT_T.init(min, min);
                vrtx[1] = PNT_T.init(max, min);
                vrtx[2] = PNT_T.init(max, max);
                vrtx[3] = PNT_T.init(min, max);

                // 内部点を判定する点集合を確保、設定する.
                int out_index = 0;
                int in_index = out_index + 1;
                int bndry_index = in_index + 1;

                pnt_num = bndry_index + 1;
                pnts = PNT_T_PTR.alloc(pnt_num);
                pnts[out_index] = PNT_T.init(min - 1, min - 1);
                pnts[in_index] = PNT_T.init(min + 1, min + 1);
                pnts[bndry_index] = PNT_T.init(min, min);

#if BNDRY_ON
                bndry_flag = 1;
#else
                bndry_flag = 0;
#endif

                // 凸多角形内部点列挙の実行.
                status = api.fnFIE_cg_points_in_convex_polygon
                    (vrtx, vrtx_num, pnts, pnt_num, bndry_flag, ref ans_pnt_no, ref ans_pnt_num);

                Assert.IsTrue(status == (int)f_err.F_ERR_NONE, "エラーが発生しました。({0})", (f_err)status);

                // 結果を出力する.
                ConsoleOut.WriteFunctionName(":\t");
                Console.Write("ans_pnt_num = {0}", ans_pnt_num);
                Console.Write("\n\tans_pnt_no = ");
                bool check = true;

                for (int i = 0; i < ans_pnt_num; i++)
                {
                    int ans = ans_pnt_no[i];
                    Console.Write("[{0}]{1}({2}, {3}),  ", i, ans, pnts[ans].x, pnts[ans].y);

#if BNDRY_ON
                    if (ans != in_index && ans != bndry_index) check = false;
#else
                    if (ans != in_index) check = false;
#endif
                }
                Console.Write(" ...");
                ConsoleOut.IsTrue(check);
            }
            catch (System.Exception ex)
            {
                throw ex;
            }
            finally
            {
                vrtx.Dispose();
                pnts.Dispose();
                ans_pnt_no.Dispose();
            }
        }
    }
}


Visual Basic Copy imageCopy
'    $Revision: 1.1 $
#Const BNDRY_ON = True

Imports System.Collections.Generic
Imports System.Text
Imports fvalgcli

Public Partial Class FIE
    <FvPluginExecute> _
    Public Sub fnFIE_cg_points_in_convex_polygon()
        Dim status As Integer = CInt(f_err.F_ERR_NONE)

        Dim vrtx As PNT_T_PTR = IntPtr.Zero
        ' [in] 凸多角形の頂点列.
        Dim vrtx_num As Integer = 0
        ' [in] 多角形の頂点数( vrtx の要素数).
        Dim pnts As PNT_T_PTR = IntPtr.Zero
        ' [in] 内部点を判定する点集合.
        Dim pnt_num As Integer = 0
        ' [in] 点集合の点の数( pnts の要素数).
        Dim bndry_flag As Integer = 0
        ' [in] 境界フラグ(境界上の点を内部の点として回答に ... 1:含める, 0:含めない).
        Dim ans_pnt_no As INT_PTR = INT_PTR.Zero
        ' [out] 内部にある点の番号(pnts での要素番号)列の先頭ポインタ.
        Dim ans_pnt_num As Integer = 0
        ' [out] 内部点の数.
        Try
            ' 凸多角形の頂点列を確保、設定する.
            Const  min As Integer = 5
            Const  max As Integer = 15

            vrtx_num = 4
            vrtx = PNT_T_PTR.alloc(vrtx_num)
            vrtx(0) = PNT_T.init(min, min)
            vrtx(1) = PNT_T.init(max, min)
            vrtx(2) = PNT_T.init(max, max)
            vrtx(3) = PNT_T.init(min, max)

            ' 内部点を判定する点集合を確保、設定する.
            Dim out_index As Integer = 0
            Dim in_index As Integer = out_index + 1
            Dim bndry_index As Integer = in_index + 1

            pnt_num = bndry_index + 1
            pnts = PNT_T_PTR.alloc(pnt_num)
            pnts(out_index) = PNT_T.init(min - 1, min - 1)
            pnts(in_index) = PNT_T.init(min + 1, min + 1)
            pnts(bndry_index) = PNT_T.init(min, min)

            #If BNDRY_ON Then
            bndry_flag = 1
            #Else
            bndry_flag = 0
            #End If

            ' 凸多角形内部点列挙の実行.
            status = api.fnFIE_cg_points_in_convex_polygon(vrtx, vrtx_num, pnts, pnt_num, bndry_flag, ans_pnt_no, _
                ans_pnt_num)

            Assert.IsTrue(status = CInt(f_err.F_ERR_NONE), "エラーが発生しました。({0})", CType(status, f_err))

            ' 結果を出力する.
            ConsoleOut.WriteFunctionName(":" & vbTab)
            Console.Write("ans_pnt_num = {0}", ans_pnt_num)
            Console.Write(vbLf & vbTab & "ans_pnt_no = ")
            Dim check As Boolean = True

            For i As Integer = 0 To ans_pnt_num - 1
                Dim ans As Integer = ans_pnt_no(i)
                Console.Write("[{0}]{1}({2}, {3}),  ", i, ans, pnts(ans).x, pnts(ans).y)

                #If BNDRY_ON Then
                If ans <> in_index AndAlso ans <> bndry_index Then
                    check = False
                End If
                #Else
                If ans <> in_index Then
                    check = False
                End If
                #End If
            Next
            Console.Write(" ...")
            ConsoleOut.IsTrue(check)
        Catch ex As System.Exception
            Throw ex
        Finally
            vrtx.Dispose()
            pnts.Dispose()
            ans_pnt_no.Dispose()
        End Try
    End Sub
End Class

See Also