数値の期間重複判定について

解決


ガオー  2021-01-24 16:52:03  No: 149572

お世話になります。

Delphi Berlin Enterpriseを使用しています。
例えば、1~100 と 50~150 と  80~200 というような数値期間があった場合
重複している判定のコーディングはどのようにすればよろしいでしょうか。
ご存知の方いらっしゃいましたら
お手数をおかけしますが教えてください。
よろしくお願いいたします。


  2021-01-24 18:07:29  No: 149573

単純に最大値と最小値を比較していけばよいと思いますが、それではだめなのでしょうか。
被らないということは、ある数列の最大値が別の数列の最小値よりも小さい、またはある数列の最小値が別の数列の最大値よりも大きい、ということだと思います。


KONNOYA  2021-01-25 08:14:06  No: 149574

その数値が整数型で、かつ抜けている番号が無いのなら
inを使うのが簡単かも?

if ( Value in [ 1..100 ] ) and ( Value in [ 50..150 ] ) and ( Value in [ 80..200 ] ) then
    Button1.Text := 'TRUE'
  else
    Button1.Text := 'FALSE';


AAA  2021-01-28 18:07:13  No: 149575

こうかな
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;


ガオー  2021-02-11 19:22:08  No: 149589

あさん、KONNOYAさん、AAAさん、アドバイスありがとうございました。
もうしわけありません。事情があってお返事できませんでした。
AAAさんのコードで実装させていただきました。
こんなことが出来るとは思いませんでした。
とても勉強になりました。
本当にありがとうございました。
今後ともよろしくおねがいいたします。


KONNOYA  2021-02-12 10:13:07  No: 149593

前回の回答は勘違いしていました。
申し訳ありません(汗

数値 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型を文字列に変換する構文です。
また勘違いしておりましたらすみません。


※返信する前に利用規約をご確認ください。








  このエントリーをはてなブックマークに追加