お世話になります。
Delphi Berlin Enterpriseを使用しています。
例えば、1~100 と 50~150 と 80~200 というような数値期間があった場合
重複している判定のコーディングはどのようにすればよろしいでしょうか。
ご存知の方いらっしゃいましたら
お手数をおかけしますが教えてください。
よろしくお願いいたします。
単純に最大値と最小値を比較していけばよいと思いますが、それではだめなのでしょうか。
被らないということは、ある数列の最大値が別の数列の最小値よりも小さい、またはある数列の最小値が別の数列の最大値よりも大きい、ということだと思います。
その数値が整数型で、かつ抜けている番号が無いのなら
inを使うのが簡単かも?
if ( Value in [ 1..100 ] ) and ( Value in [ 50..150 ] ) and ( Value in [ 80..200 ] ) then
Button1.Text := 'TRUE'
else
Button1.Text := 'FALSE';
こうかな
function XXX(Value11,Value12,Value21,Value22: Integer): Boolean;
begin
Result := False;
if (Value11 <= Value21) and (Value21 <= Value12) then Result := True;
if (Value11 <= Value22) and (Value22 <= Value12) then Result := True;
end;
var
I,J: Integer;
B: Boolean;
V1: array[0..3] of TPoint;
B := False;
for I:=0 to 3 do
begin
for J:=0 to 3 do
begin
if I<>J then
begin
B :=B or XXX (V1[I].X,V1[I].Y,V1[J].X,V1[J].Y);
end;
end;
end;
あさん、KONNOYAさん、AAAさん、アドバイスありがとうございました。
もうしわけありません。事情があってお返事できませんでした。
AAAさんのコードで実装させていただきました。
こんなことが出来るとは思いませんでした。
とても勉強になりました。
本当にありがとうございました。
今後ともよろしくおねがいいたします。
前回の回答は勘違いしていました。
申し訳ありません(汗
数値 1~100 と 50~150 と 80~200の重複判定なのだとしたら、
下記の方法でも行えます。
uses System.Types;
procedure TForm1.Button1Click( Sender : TObject );
var
CheckRes : Boolean;
begin
CheckRes := CheckDup( 1, 100, 50, 150 ) and
CheckDup( 1, 100, 80, 200 ) and
CheckDup( 50, 150, 80, 200 );
Button1.Text := CheckRes.ToString( TUseBoolStrs.True );
end;
function TForm1.CheckDup( const A1, A2, B1, B2 : Integer ) : Boolean;
begin
Result := IntersectRect( Rect( A1, 0, A2, 5 ), Rect( B1, 0, B2, 5 ) );
end;
System.Types の IntersectRect() を利用しています。
元々、矩形の衝突判定する物で、
利用する側で扱いやすくする為、わざわざ関数化しています。
実数である場合は、IntersectRectF() という物もあります。
最後の .ToString( TUseBoolStrs.True ) は、
Boolean型を文字列に変換する構文です。
また勘違いしておりましたらすみません。
ツイート | ![]() |