点群の変換係数の算出による、座標系変換行列の生成

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

Syntax

C#
public static int fnFIE_modelview_set_points(
	F_MODELVIEW_PTR param,
	bool reverse_y,
	DPNT_T_PTR screen_pnts,
	DPNT_T_PTR world_pnts,
	int pnt_num
)
Visual Basic
Public Shared Function fnFIE_modelview_set_points ( 
	param As F_MODELVIEW_PTR,
	reverse_y As Boolean,
	screen_pnts As DPNT_T_PTR,
	world_pnts As DPNT_T_PTR,
	pnt_num As Integer
) As Integer

Parameters

param
Type: fvalgcli..::..F_MODELVIEW_PTR
座標変換係数
reverse_y
Type: System..::..Boolean
Y軸方向
  • TRUE 反転有り(Y軸正方向が上向き)
  • FALSE 反転無し(Y軸正方向が下向き)
screen_pnts
Type: fvalgcli..::..DPNT_T_PTR
変換前座標から見た点群
world_pnts
Type: fvalgcli..::..DPNT_T_PTR
変換後座標から見た点群
pnt_num
Type: System..::..Int32
点群に入っている点の数(2〜100)

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 fvalgcli;

namespace TC
{
    public partial class FIE
    {
        /// <summary>
        /// 点群の変換係数の算出による、座標系変換行列の生成.
        /// </summary>
        [FvPluginExecute]
        public void fnFIE_modelview_set_points()
        {
            int status = (int)f_err.F_ERR_NONE;

            F_MODELVIEW_PTR param = F_MODELVIEW_PTR.Zero;

            // パラメータ.
            bool reverse_y = false;
            DPNT_T_PTR screen_pnts = DPNT_T_PTR.Zero;
            DPNT_T_PTR world_pnts = DPNT_T_PTR.Zero;
            int pnt_num = 4;

            // 変換行列.
            FMATRIX_PTR mat_shift = FMATRIX_PTR.Zero;
            FMATRIX_PTR mat_scale = FMATRIX_PTR.Zero;
            FMATRIX_PTR mat = FMATRIX_PTR.Zero;

            // 変換行列生成用パラメータ(平行移動).
            double dx = 75;
            double dy = 75;

            // 変換行列生成用パラメータ(スケール).
            double sx = 2.0;
            double sy = 2.0;

            try
            {
                // 確保.
                param = api.fnFIE_modelview_alloc_param();
                screen_pnts = DPNT_T_PTR.alloc(pnt_num);
                world_pnts = DPNT_T_PTR.alloc(pnt_num);

                // 行列の領域確保.
                mat_shift = FMATRIX_PTR.alloc(3, 3);
                mat_scale = FMATRIX_PTR.alloc(3, 3);
                mat = FMATRIX_PTR.alloc(3, 3);

                // 回転及びスケールの変換行列を求める.
                api.fnFIE_geotrans_calc_shift_matrix(mat_shift, dx, dy);
                api.fnFIE_geotrans_calc_scale_matrix(mat_scale, sx, sy);

                // 行列を掛け,1つの行列にまとめる.
                api.fnFIE_mat_mul_aa(mat_scale, mat_shift, mat);

                // 点列の座標を指定する.
                screen_pnts[0] = DPNT_T.init(50, 50);
                screen_pnts[1] = DPNT_T.init(100, 50);
                screen_pnts[2] = DPNT_T.init(50, 100);
                screen_pnts[3] = DPNT_T.init(100, 100);

                // 点列をアフィン変換してワールド座標系での点群とする.
                api.fnFIE_geotrans_affine_npoints(screen_pnts, world_pnts, pnt_num, mat);

                status = api.fnFIE_modelview_set_points(param, reverse_y, screen_pnts, world_pnts, pnt_num);

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

                // 結果表示.
                ConsoleOut.WriteFunctionName(":\n");
                Console.WriteLine(" reverse_y = {0}\n angle = {1}\n move = ({2},{3})\n scale = ({4},{5})",
                                    param.reverse_y, param.angle, param.move_x, param.move_y, param.scale_x, param.scale_y);
                ConsoleOut.WriteFMATRIX(param.forward, param.forward.row, param.forward.col);
                ConsoleOut.WriteFMATRIX(param.backward, param.backward.row, param.backward.col);
                Console.Write(" ...");
                ConsoleOut.IsEqualMatrix(param.backward, 0.5, 0, -75, 0, 0.5, -75, 0, 0, 1);
            }
            finally
            {
                param.Dispose();
                screen_pnts.Dispose();
                world_pnts.Dispose();
                mat_shift.Dispose();
                mat_scale.Dispose();
                mat.Dispose();
            }
        }
    }
}


Visual Basic Copy imageCopy
'    $Revision: 1.1 $

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

Public Partial Class FIE
    ''' <summary>
    ''' 点群の変換係数の算出による、座標系変換行列の生成.
    ''' </summary>
    <FvPluginExecute> _
    Public Sub fnFIE_modelview_set_points()
        Dim status As Integer = CInt(f_err.F_ERR_NONE)

        Dim param As F_MODELVIEW_PTR = F_MODELVIEW_PTR.Zero

        ' パラメータ.
        Dim reverse_y As Boolean = False
        Dim screen_pnts As DPNT_T_PTR = DPNT_T_PTR.Zero
        Dim world_pnts As DPNT_T_PTR = DPNT_T_PTR.Zero
        Dim pnt_num As Integer = 4

        ' 変換行列.
        Dim mat_shift As FMATRIX_PTR = FMATRIX_PTR.Zero
        Dim mat_scale As FMATRIX_PTR = FMATRIX_PTR.Zero
        Dim mat As FMATRIX_PTR = FMATRIX_PTR.Zero

        ' 変換行列生成用パラメータ(平行移動).
        Dim dx As Double = 75
        Dim dy As Double = 75

        ' 変換行列生成用パラメータ(スケール).
        Dim sx As Double = 2.0
        Dim sy As Double = 2.0

        Try
            ' 確保.
            param = api.fnFIE_modelview_alloc_param()
            screen_pnts = DPNT_T_PTR.alloc(pnt_num)
            world_pnts = DPNT_T_PTR.alloc(pnt_num)

            ' 行列の領域確保.
            mat_shift = FMATRIX_PTR.alloc(3, 3)
            mat_scale = FMATRIX_PTR.alloc(3, 3)
            mat = FMATRIX_PTR.alloc(3, 3)

            ' 回転及びスケールの変換行列を求める.
            api.fnFIE_geotrans_calc_shift_matrix(mat_shift, dx, dy)
            api.fnFIE_geotrans_calc_scale_matrix(mat_scale, sx, sy)

            ' 行列を掛け,1つの行列にまとめる.
            api.fnFIE_mat_mul_aa(mat_scale, mat_shift, mat)

            ' 点列の座標を指定する.
            screen_pnts(0) = DPNT_T.init(50, 50)
            screen_pnts(1) = DPNT_T.init(100, 50)
            screen_pnts(2) = DPNT_T.init(50, 100)
            screen_pnts(3) = DPNT_T.init(100, 100)

            ' 点列をアフィン変換してワールド座標系での点群とする.
            api.fnFIE_geotrans_affine_npoints(screen_pnts, world_pnts, pnt_num, mat)

            status = api.fnFIE_modelview_set_points(param, reverse_y, screen_pnts, world_pnts, pnt_num)

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

            ' 結果表示.
            ConsoleOut.WriteFunctionName(":" & vbLf)
            Console.WriteLine(" reverse_y = {0}" & vbLf & " angle = {1}" & vbLf & " move = ({2},{3})" & vbLf & " scale = ({4},{5})", param.reverse_y, param.angle, param.move_x, param.move_y, param.scale_x, _
                param.scale_y)
            ConsoleOut.WriteFMATRIX(param.forward, param.forward.row, param.forward.col)
            ConsoleOut.WriteFMATRIX(param.backward, param.backward.row, param.backward.col)
            Console.Write(" ...")
            ConsoleOut.IsEqualMatrix(param.backward, 0.5, 0, -75, 0, 0.5, _
                -75, 0, 0, 1)
        Finally
            param.Dispose()
            screen_pnts.Dispose()
            world_pnts.Dispose()
            mat_shift.Dispose()
            mat_scale.Dispose()
            mat.Dispose()
        End Try
    End Sub
End Class

See Also