なんかベクトルを使えばいい感じでできそうだし、素敵なノードがありそうだけど最短の解決法ってことで実装しときました。あとで「えぇええ・・・」みたいな感じに絶対なる気がする。
あ。さらに複数点の場合にも対応したいか・・・いずれやる(汗
判定部分はこちらのサイトを参考にさせてもらいました。コメントもそのままだったりして・・・(汗
ソースコードをjsでいい感じで表示したいが、あとでやるってことで(汗
#region usings
using System;
using System.ComponentModel.Composition;
using VVVV.PluginInterfaces.V1;
using VVVV.PluginInterfaces.V2;
using VVVV.Utils.VColor;
using VVVV.Utils.VMath;
using VVVV.Core.Logging;
#endregion usings
namespace VVVV.Nodes
{
#region PluginInfo
[PluginInfo(Name = "OnRect", Category = "Boolean", Help = "Basic template with one boolean in/out", Tags = "")]
#endregion PluginInfo
public class BooleanInRectNode : IPluginEvaluate
{
#region fields & pins
[Input("Input")]
public ISpread<Vector2D> FInput;
[Input("RectPoint")]
public ISpread<Vector2D> FRectPoint;
[Output("bool")]
public ISpread<bool> FOutput;
[Import()]
public ILogger FLogger;
#endregion fields & pins
//called when data for any output pin is requested
public void Evaluate(int SpreadMax)
{
FOutput.SliceCount = SpreadMax;
FOutput[0] = false;
if(SpreadMax != 4){
FLogger.Log(LogType.Debug, "SpreadMax:" + SpreadMax);
FOutput[0] = false;
return;
}
Vector2D xp = new Vector2D(FInput[0]);
//FLogger.Log(LogType.Debug, "xp:" + xp.x + "," + xp.y);
Vector2D p1 = new Vector2D(FRectPoint[0]);
Vector2D p2 = new Vector2D(FRectPoint[1]);
Vector2D p3 = new Vector2D(FRectPoint[2]);
Vector2D p4 = new Vector2D(FRectPoint[3]);
//三角形のどちらかに入っていればtrue
if(!PosIncludeTri(p1,p2,p3,xp) && !PosIncludeTri(p2,p3,p4,xp)){
FOutput[0] = false;
}else{
FOutput[0] = true;
}
//FLogger.Log(LogType.Debug, "hi TTY");
}
//http://www5d.biglobe.ne.jp/~tomoya03/shtml/algorithm/Hougan.htm
//座標 p1,p2 を通る直線と座標 p3,p4 を結ぶ線分が交差しているかを調べる
//戻り値
//= 0 - 直線上に線分の1点 or 2点がある
//< 0 - 直線と線分が交差する
//> 0 - 直線と線分は交差しない
private double intersectM(Vector2D p1 ,Vector2D p2 ,Vector2D p3,Vector2D p4){
double checkResult = ((p1.x - p2.x) * (p3.y - p1.y) + (p1.y - p2.y) * (p1.x - p3.x))
* ((p1.x - p2.x) * (p4.y - p1.y) + (p1.y - p2.y) * (p1.x - p4.x));
//FLogger.Log(LogType.Debug, "checkResult:" + checkResult);
return checkResult;
}
//ある点が三角形内の点であるかどうかを判定する
//tp1,tp2,tp3 三角形を構成する点
//xp ある点
//ある点が三角形内の点であれば True,外の点であれば False を返す
//ただし、三角形の境界線上の点に対しては、Trueを返す
private bool PosIncludeTri(Vector2D tp1,Vector2D tp2,Vector2D tp3,Vector2D xp){
Vector2D c = new Vector2D();
//与えられる三角形の3点のチェック
//3点が一直線上にある(三角形ではない)とき、「包含しない」と判定
if ((tp1.x - tp3.x) * (tp1.y - tp2.y) == (tp1.x - tp2.x) * (tp1.y - tp3.y)) {
//FLogger.Log(LogType.Debug, "not triangle");
return false;
}
//三角形の平均値を求める
c.x = (tp1.x + tp2.x + tp3.x) / 3;
c.y = (tp1.y + tp2.y + tp3.y) / 3;
//3点の中心とある点を結ぶ線分が三角形を構成する直線と交差するならば、
//ある点は三角形に包含していない
if (intersectM(tp1, tp2, xp, c) < 0) {
//FLogger.Log(LogType.Debug, "f1");
return false;
}
if (intersectM(tp1, tp3, xp, c) < 0) {
//FLogger.Log(LogType.Debug, "f2");
return false;
}
if (intersectM(tp2, tp3, xp, c) < 0) {
//FLogger.Log(LogType.Debug, "f3");
return false;
}
//FLogger.Log(LogType.Debug, "inside ");
return true;
}
}
}
0 件のコメント:
コメントを投稿