1

関数ファイルを使用しています[ret]=drawellipse(x,y,a,b,angle,steps,color,img)。スクリプト ファイルを介して関数を呼び出して、画像にランダムな楕円を描画します。しかし、ランダムな中心点(x、y)とランダムなa、bを設定すると、楕円の交差が発生する可能性が高くなります。交差を防ぐにはどうすればよいですか?(私は、互いに別々の楕円を描画することになっています) さて、ここに、楕円が重なり合っているかどうかをチェックする関数ファイルがありますoverlap = overlap_ellipses(x0,y0,a0,b0,angle0,x1,y1,a1,b1,angle1)。2 つの楕円が重なっている場合は「overlap=1」、そうでない場合は「overlap=0」です。これらすべてに基づいて、コマンドウィンドウでテストしました:

x=rand(4,1)*400;  % x and y are the random coodinates for the center of ellipses
y=rand(4,1)*400;
a=[50 69 30 60];  % major axis   for a and b, i intend to use random also in the future
b=[20 40 10 40];  % minor axis
angle=[30 90 45 0]; % angle of ellipse
steps=10000;
color=[255 0 0];   % inputs for another function file to draw the ellipse
img=zeros(500,500,3);

次の例では、楕円if overlap==0を表示し、「オーバーラップ == 1 の場合」、交差がなくなるまで a と b を減らします。最後に、img を表示します。

for i=1:length(x)
img=drawellipse(x(i),y(i),a(i),b(i),angle(i),steps,color,img);
end

私にとっては、中間部分のコーディングが困難です。if ステートメントを使用して値を取得するoverlap方法と、描画する必要がある楕円に対応するインデックスを作成する方法を教えてください。

私は少しのようにテストしました

for k=1:(length(x)-1)
overlap = overlap_ellipses(x(1),y(1),a(1),b(1),angle(1),x(1+k),y(1+k),a(1+k),b(1+k),angle(1+k))
end

戻ります

overlap=0
overlap=0
overlap=1

[0 0 1] ではありません。私はそれを理解できないので、プロセスに行き詰まっています。最終的な画像は、この楕円のボロノイ図の図のようになります。(2 つの楕円の間に交点はありません)

4

3 に答える 3

3

楕円をラスター グラフィックス イメージに描画すると仮定すると、楕円を描画するために必要なピクセルを計算し、イメージ内のこれらのピクセルがまだ背景色であるかどうかを確認し、答えが「はい」の場合にのみ楕円を描画できます。 、それ以外の場合は拒否し (他の何か、つまり別の楕円が邪魔になるため)、他のxyaおよびを試しbます。

または、画像を長方形 (必ずしも同じサイズではない) に分割し、楕円が長方形を超えないように x、y、a、b を選択して、それぞれに 1 つの楕円を配置することもできます。これで十分かどうかは、楕円の配置にどれだけの「ランダム性」が必要かによって異なります。

数学的に厳密な方法は、描画された各楕円の x、y、a、b を保存し、新しい楕円ごとに、2 つの二次方程式のシステムを解くことによって共通点があるかどうかをペアごとにチェックすることです。ただし、特に角度が 0 でない場合、これは少し複雑になる可能性があります。

追加されたコードに応じて編集x: ループの前にすべての とを修正する代わりにy、ループ内でそれらを決定できます。必要な楕円の数はわかっていますが、サンプリングする必要がある楕円の数がわからないため、whileループが必要です。あなたが与えるテストループは便利かもしれませんが、以前のすべての楕円を、最初のものではなく、ループの繰り返しで作成されたものと比較する必要があります。

i=1;
while (i<=4) %# or length(a), or, more elegantly, some pre-defined max
    x(i) = rand*400; y(i) = rand*400; %# or take x and y as givren and decrease a and b
    %# now, check overlap for given center
    overlap = false;
    for k=1:(i-1)
       overlap = overlap || overlap_ellipses(x(i),y(i),a(i),b(i),angle(i),x(k),y(k),a(k),b(k),angle(k))
    end
    if (~overlap)
        img = drawellipse(x(i),y(i),a(i),b(i),angle(i),steps,color,img);
        i = i+1; %# determine next ellipse
    end %# else x(i) and y(i) will be overwritten in next while loop iteration
end

もちろん、abが固定されている場合、残念ながら既に存在する楕円が配置されている場合、楕円が画像の寸法に適合しないことが起こり、無限ループが発生します。中心を固定したままにし、収まるまで楕円のサイズを小さくするというあなたの計画について: あなたのoverlap_ellipses方法はどこから来たのですか? 1 つの楕円が他の楕円の隣に収まるように縮小する必要がある係数 (既に収まっている場合は 1) を返すように適応できるでしょうか?

于 2011-10-20T11:07:19.280 に答える
1

1 つのオプションは、既に描画されているすべての楕円を追跡し、次の一連の[x,y,a,b]楕円が既存のものと交差する新しい楕円を生成しないようにすることです。条件を満たすセットが見つかるまで乱数を呼び出すか、条件に違反するセットを取得したら、交差が発生しなくなるまでaand/orの値を減らします。b

于 2011-10-20T11:06:13.990 に答える