複数点群を通る円の中心座標と半径の算出

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

Syntax

C#
public static int fnFIE_cg_calc_circle_npoints(
	DPNT_T_PTR[] pnts_set,
	int[] num_set,
	int set_num,
	ref DPNT_T center,
	ref double radius
)
Visual Basic
Public Shared Function fnFIE_cg_calc_circle_npoints ( 
	pnts_set As DPNT_T_PTR(),
	num_set As Integer(),
	set_num As Integer,
	ByRef center As DPNT_T,
	ByRef radius As Double
) As Integer

Parameters

pnts_set
Type: array<fvalgcli..::..DPNT_T_PTR>[]()[][]
複数の座標点群Gnの配列。 3個以上の要素が必要
num_set
Type: array<System..::..Int32>[]()[][]
各点群に入っている点の個数の配列。 set_num 個分の要素が必要
set_num
Type: System..::..Int32
点群数
center
Type: fvalgcli..::..DPNT_T%
円の中心座標Pc
radius
Type: System..::..Double%
円の半径r

Return Value

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

エラーコード:
f_err内容
F_ERR_NONE正常終了
F_ERR_INVALID_PARAM 不正なパラメータが渡された
F_ERR_CALC_IMPOSSIBLE 計算不能エラー
F_ERR_NOMEMORYメモリ不足
F_ERR_NO_LICENCEライセンスエラー、または未初期化エラー

Remarks

Examples

C# Copy imageCopy
//    $Revision: 1.1 $

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

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

            DPNT_T_PTR pts0 = IntPtr.Zero;
            DPNT_T_PTR pts1 = IntPtr.Zero;
            DPNT_T_PTR pts2 = IntPtr.Zero;
            const int _PNTS_SET_NUM = 3;
            DPNT_T_PTR[] pnts_set = new DPNT_T_PTR[_PNTS_SET_NUM];
            int[] num_set = new int[_PNTS_SET_NUM];
            int set_num = _PNTS_SET_NUM;
            DPNT_T center = new DPNT_T();
            double radius = new double();

            const double ans_radius = 52.771415410562;

            try
            {
                pts0 = MakePoints(0); // G0:要素数5.
                pts1 = MakePoints(1); // G1:要素数6.
                pts2 = MakePoints(2); // G2:要素数8.

                // 複数の座標点群Gnの配列.
                pnts_set[0] = pts0;
                pnts_set[1] = pts1;
                pnts_set[2] = pts2;

                // 各点群に入っている点の個数の配列.
                num_set[0] = 5;
                num_set[1] = 6;
                num_set[2] = 8;

                status = api.fnFIE_cg_calc_circle_npoints(pnts_set, num_set, set_num, ref center, ref radius);

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

                // 結果を出力する.
                ConsoleOut.WriteFunctionName(":\n");
                Console.WriteLine("center = ({0},{1}), radius = {2}", center.x, center.y, radius);
                Console.Write(" ...");
                ConsoleOut.IsTrue(DblEqual(radius, ans_radius));
            }
            catch (System.Exception ex)
            {
                throw ex;
            }
            finally
            {
                pts0.Dispose();
                pts1.Dispose();
                pts2.Dispose();
            }
        }

        /// <summary>
        /// テスト用点群の生成
        /// </summary>
        /// <param name="option">オプション</param>
        /// <returns>点群を返します。</returns>
        private DPNT_T_PTR MakePoints(int option)
        {
            DPNT_T_PTR result = DPNT_T_PTR.Zero;

            switch (option)
            {
                case 0:
                    {
                        result = DPNT_T_PTR.alloc(5);
                        result[0] = DPNT_T.init(50,20);
                        result[1] = DPNT_T.init(60,10);
                        result[2] = DPNT_T.init(70,10);
                        result[3] = DPNT_T.init(80,10);
                        result[4] = DPNT_T.init(90,20);
                    }
                    break;
                case 1:
                    {
                        result = DPNT_T_PTR.alloc(6);
                        result[0] = DPNT_T.init(100,60);
                        result[1] = DPNT_T.init(110,70);
                        result[2] = DPNT_T.init(120,80);
                        result[3] = DPNT_T.init(130,90);
                        result[4] = DPNT_T.init(140,100);
                        result[5] = DPNT_T.init(150,110);
                    }
                    break;
                case 2:
                    {
                        result = DPNT_T_PTR.alloc(8);
                        result[0] = DPNT_T.init(10,50);
                        result[1] = DPNT_T.init(20,60);
                        result[2] = DPNT_T.init(30,70);
                        result[3] = DPNT_T.init(40,80);
                        result[4] = DPNT_T.init(50,90);
                        result[5] = DPNT_T.init(60,100);
                        result[6] = DPNT_T.init(70,110);
                        result[7] = DPNT_T.init(80, 120);
                    }
                    break;
            }
            return result;
        }
    }
}


Visual Basic Copy imageCopy
'    $Revision: 1.1 $

Imports System.Collections.Generic
Imports System.Text
Imports System.Runtime.InteropServices
Imports fvalgcli

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

        Dim pts0 As DPNT_T_PTR = IntPtr.Zero
        Dim pts1 As DPNT_T_PTR = IntPtr.Zero
        Dim pts2 As DPNT_T_PTR = IntPtr.Zero
        Const  _PNTS_SET_NUM As Integer = 3
        Dim pnts_set As DPNT_T_PTR() = New DPNT_T_PTR(_PNTS_SET_NUM - 1) {}
        Dim num_set As Integer() = New Integer(_PNTS_SET_NUM - 1) {}
        Dim set_num As Integer = _PNTS_SET_NUM
        Dim center As New DPNT_T()
        Dim radius As New Double()

        Const  ans_radius As Double = 52.771415410562

        Try
            pts0 = MakePoints(0)
            ' G0:要素数5.
            pts1 = MakePoints(1)
            ' G1:要素数6.
            pts2 = MakePoints(2)
            ' G2:要素数8.
            ' 複数の座標点群Gnの配列.
            pnts_set(0) = pts0
            pnts_set(1) = pts1
            pnts_set(2) = pts2

            ' 各点群に入っている点の個数の配列.
            num_set(0) = 5
            num_set(1) = 6
            num_set(2) = 8

            status = api.fnFIE_cg_calc_circle_npoints(pnts_set, num_set, set_num, center, radius)

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

            ' 結果を出力する.
            ConsoleOut.WriteFunctionName(":" & vbLf)
            Console.WriteLine("center = ({0},{1}), radius = {2}", center.x, center.y, radius)
            Console.Write(" ...")
            ConsoleOut.IsTrue(DblEqual(radius, ans_radius))
        Catch ex As System.Exception
            Throw ex
        Finally
            pts0.Dispose()
            pts1.Dispose()
            pts2.Dispose()
        End Try
    End Sub

    ''' <summary>
    ''' テスト用点群の生成
    ''' </summary>
    ''' <param name="option">オプション</param>
    ''' <returns>点群を返します。</returns>
    Private Function MakePoints([option] As Integer) As DPNT_T_PTR
        Dim result As DPNT_T_PTR = DPNT_T_PTR.Zero

        Select Case [option]
            Case 0
                If True Then
                    result = DPNT_T_PTR.alloc(5)
                    result(0) = DPNT_T.init(50, 20)
                    result(1) = DPNT_T.init(60, 10)
                    result(2) = DPNT_T.init(70, 10)
                    result(3) = DPNT_T.init(80, 10)
                    result(4) = DPNT_T.init(90, 20)
                End If
                Exit Select
            Case 1
                If True Then
                    result = DPNT_T_PTR.alloc(6)
                    result(0) = DPNT_T.init(100, 60)
                    result(1) = DPNT_T.init(110, 70)
                    result(2) = DPNT_T.init(120, 80)
                    result(3) = DPNT_T.init(130, 90)
                    result(4) = DPNT_T.init(140, 100)
                    result(5) = DPNT_T.init(150, 110)
                End If
                Exit Select
            Case 2
                If True Then
                    result = DPNT_T_PTR.alloc(8)
                    result(0) = DPNT_T.init(10, 50)
                    result(1) = DPNT_T.init(20, 60)
                    result(2) = DPNT_T.init(30, 70)
                    result(3) = DPNT_T.init(40, 80)
                    result(4) = DPNT_T.init(50, 90)
                    result(5) = DPNT_T.init(60, 100)
                    result(6) = DPNT_T.init(70, 110)
                    result(7) = DPNT_T.init(80, 120)
                End If
                Exit Select
        End Select
        Return result
    End Function
End Class

See Also