私はいくつかのコア グラフィックスを作成していますが、線の一部が画面に表示されるかどうかをどのように知ることができるのだろうかと考えています。
x-5, y3 から x2, y-7 に向かう直線を見てみましょう。幅が 1 ピクセルの場合、画面には何も表示されません。幅が 15 ピクセルの場合、一部が表示されます。
どうすればそれを確認できますか?
私はいくつかのコア グラフィックスを作成していますが、線の一部が画面に表示されるかどうかをどのように知ることができるのだろうかと考えています。
x-5, y3 から x2, y-7 に向かう直線を見てみましょう。幅が 1 ピクセルの場合、画面には何も表示されません。幅が 15 ピクセルの場合、一部が表示されます。
どうすればそれを確認できますか?
線しかない場合は、以下の機能を使用できます。それ以外の場合は、線の全長を調べて、特定の距離で線幅サイズの正方形を作成し、それがビュー内にあるかどうかを確認することをお勧めします。例: x0y0 から x7y0 までのラインがある場合。x1y0 に移動して、描画線サイズ (この例では 15) の正方形を作成し、これが画面に重なるかどうかを確認します。次に x2y0 などに移動します。利点は、ベジェ曲線でも機能することです(ベジェ作業で十分な方法についての少しのwiki情報)。
// 編集: (少しベジエ チェック関数を作成しましたが、動作するはずですが、テストしていません) そして、描画する前に各行をチェックする方がパフォーマンスが効率的だとは思いません:
- (void)bezierWithStart:(CGPoint)start cp1:(CGPoint)cp1 cp2:(CGPoint)cp2 end:(CGPoint)end withWidth:(float)wid {
for (float i = 0.0; i<=1.0; i+=0.05) { // how many steps
CGPoint chk1 = CGPointMake(start.x+((cp1.x-start.x)*i), start.y+((cp1.y-start.y)*i));
CGPoint chk2 = CGPointMake(cp1.x+((cp2.x-cp1.x)*i), cp1.y+((cp2.y-cp1.y)*i));
CGPoint chk3 = CGPointMake(cp2.x+((end.x-cp2.x)*i), cp2.y+((end.y-cp2.y)*i));
CGPoint chk4 = CGPointMake(chk1.x+((chk2.x-chk1.x)*i), chk1.y+((chk2.y-chk1.y)*i));
CGPoint chk5 = CGPointMake(chk2.x+((chk3.x-chk2.x)*i), chk2.y+((chk3.y-chk2.y)*i));
CGPoint cPoint = CGPointMake(chk4.x+((chk5.x-chk4.x)*i), chk4.y+((chk5.y-chk4.y)*i));
CGRect drawLine = CGRectMake(cPoint.x-(wid/2), cPoint.y-(wid/2), wid, wid);
// check if rect is in view
}
}
//編集終了
しかし、今度は単純な line 関数に行きましょう:
- (void)testLine:(CGPoint)fp toSecond:(CGPoint)sp withWidth:(float)wid {
float xratio = sp.x - fp.x;
float yratio = sp.y - fp.y;
double a = sqrt(((wid*wid)*(xratio*xratio))/((yratio*yratio)+(xratio*xratio)));
a/=2; // because line width goes in both direction
double b = (yratio/xratio)*a;
if ((xratio<0.0 && yratio<0.0) || (xratio>0.0 && yratio>0.0))b*=-1;
CGPoint diffFrom1 = CGPointMake(fp.x+a, fp.y+b);
CGPoint diffTo1 = CGPointMake(sp.x+a, sp.y+b);
a*=-1;
b*=-1;
CGPoint diffFrom2 = CGPointMake(fp.x+a, fp.y+b);
CGPoint diffTo2 = CGPointMake(sp.x+a, sp.y+b);
}
4ポイントもらえます。元の線の上と下に 1 本ずつ、描画幅の半分のサイズの 2 本の線。背後にある計算は、描画方向を取得することであり、そのための元の線との差です。しかし、それに参加したい人のために、私の事前計算は次のとおりです。