2017年2月3日金曜日

vvvv 四角形の中にある点が入っていればON、入っていなければOFF

四角形の中にある点が入っていればON、入っていなければOFFというノードを探したんだけど見つけられなかったので自分で実装。
なんかベクトルを使えばいい感じでできそうだし、素敵なノードがありそうだけど最短の解決法ってことで実装しときました。あとで「えぇええ・・・」みたいな感じに絶対なる気がする。

あ。さらに複数点の場合にも対応したいか・・・いずれやる(汗




判定部分はこちらのサイトを参考にさせてもらいました。コメントもそのままだったりして・・・(汗



ソースコードを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;
 
}

}
}

2017年2月2日木曜日

【vvvv】CARとStalloneとAdd(String Spectral) (+)

忘れっぽいのでノードの特性をメモしときます。

■CAR
スプレッドの最初とそれ以外は分割してくれる。Queueに突っ込んでCARで取り出すとウニョウニョ系な何かが出来そう。



■Stallone
スプレッドを1つずつ取得するのはGetSliceだけど、スプレッドをべたに分割するのはなにを使うのかが思い出せずにしばらく悩んでた。
これです。インスペクターでInput Count と Output Countを変更できます。




■Add(String Spectral)
本当はSpreadの値をまとめてCSVにしたかったんですが、やっと思い出しました。
「+」でよかったんですよね・・・。こういうことって結構あるんだよ(汗