🚀 go-pugleaf

RetroBBS NetNews Server

Inspired by RockSolid Light RIP Retro Guy

Article View: fj.comp.theory
Article #77

Re: 点列の間引き

#77
From: S.Kubo
Date: Mon, 16 Mar 1998 00:00
111 lines
4938 bytes
久保です。

manabu ishi wrote in message <6ei0h2$20k@sunsp.sunsp.mcor.co.jp>...
>さて、久保さんに頂いたご回答ですが、
>大変参考になったのですが、一つ分からないところがありました。
>
>|1.始点->終点を線分で結ぶ。
>|2.中間の点を順番に以下の処理をする。
>|3.「1」の線分と「2」への距離がある誤差範囲を超えたら
>| 始点->誤差範囲を超えた点、誤差範囲を超えた点->終点
>| の2つを新しい線分にする。
>
>「2.の中間の点」というのは、線分の中間ということではなく、
>トレースポイント間の曲線の中間の点、ということになるのだと
>思いますが(もし違っていたら申し訳ありません)、
>そうすると、以下のような場合はどのように回避すれば
>良いのでしょうか?
>
>この図だと、誤差は0になってしまいますよね?
>
>    +++
>   +   +
>  +     +
> +       +
>*------¥------*
>           +        +
>            +      +
>             +    +
>              +++
>
> *:トレースポイント
> ¥:トレースポイント間の曲線の中間の点
> +:(実際には滑らかな線で表されているのでこの点はないが)曲線を表す点。
> -:トレースポイント間を結ぶ線分
>
>
>このような形状の場合は1本の線分で表されると思うのですが、
>諦めるしかないのでしょうか?


うーーん。説明がへたくそで済みません。
「一番遠い点」と言う言葉をはしょりました(^^;

>「2.の中間の点」というのは、線分の中間ということではなく、
>トレースポイント間の曲線の中間の点、ということになるのだと
>思いますが(もし違っていたら申し訳ありません)、

途中の点全てをサーチして一番遠い点だと思ってください。
#固定長フォントでなくても良いですね?

元
    +++
   +   +
  +     +
 +       +
S------+-------E
           +        +
            +      +
             +    +
              +++
Step1
    +Q+
   +   +
  +     +
 +       +
S------+------E
           +   |    +
            +  |   +
             + |  +
              +P+
P点が一番遠いので、S->PとP->Eの線分にする。
次のステップS->Pの線分はQ点が遠いのでS->Q、Q->P。
この一番遠い点が誤差内なら処理終了。
すると例の曲線は、
S->Q->P->Eと言う折れ線になります。
誤差を小さく取ると曲率の付近で細かい線分になることが
作図でわかると思います。

#ところでこのCADは「手書き図面」じゃないですよね?
#手書き線をベクタデータ変換にするとか?
#それとも地図かな?

origin=オリジナル点列
create=生成後点列

void ReEnter( WORD sIndex, WORD eIndex ){
Line = origin[]の指標 sIndex,eIndex から直線の式を生成。
 pos(遠い指標点); F = 0(最長);
 for( register WORD i = sIndex + 1; i < eIndex; i++ ){
  long ph = Lineとorigin[i]点の長さ(直線と垂線の足)計算。
  if( F < ph ){ F = ph; pos = i; }最長点長さと指標の記憶
 }
 if( F > 許容誤差 ){
  ReEnter( sIndex, pos ); 再帰に入れちゃう。
  ReEnter( pos, eIndex ); 再帰に入れちゃう。
 }else{
  create[生成後の点列指標++] = eIndex;
 }
}
こんな感じかな?
これでoriginを間引いた線分の折れ線の指標がCreateに溜まります。
origin[100]で使う点(最長点)が3,6,10,40,60なら、
create[] = { 3,6,10,40,60 }が入ると言うことです。
点は、origin[create[3]]で取り出す。

~~~~~~~~~~久保覚~~
>・・<。oO   E-mail rest@big.or.jp (WEB)
ミ__ミ         E-mail pao@mfi.or.jp (Private)
URL http://www2.big.or.jp/~rest/
_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/
Technical Details
Message-ID: <6eimi8$1bm@mail.mfi.or.jp>
Path: arc1-ca.pugleaf.net!unknown!not-for-mail
References: <6e7fqr$2fr@sunsp.sunsp.mcor.co.jp> <6eh7ce$h7t@mail.mfi.or.jp> <6ei0h2$20k@sunsp.sunsp.mcor.co.jp>

Show Full Headers
Complete Article Headers
X-Google-Language: Japanese,JIS
X-Google-Thread: f4956,7a88fc761ab60d2a
X-Google-Attributes: gidf4956,public
X-Google-Thread: 10a0b6,1d835a804232b23b
X-Google-Attributes: gid10a0b6,public
From: "S.Kubo" <pao@mfi.or.jp>
Subject: Re: 点列の間引き
Date: 1998/03/16
Message-ID: <6eimi8$1bm@mail.mfi.or.jp>
X-Deja-AN: 334475728
Content-Transfer-Encoding: 7bit
References: <6e7fqr$2fr@sunsp.sunsp.mcor.co.jp> <6eh7ce$h7t@mail.mfi.or.jp> <6ei0h2$20k@sunsp.sunsp.mcor.co.jp>
Mime-Version: 1.0
Content-Type: text/plain; charset="iso-2022-jp"
X-MimeOLE: Produced By Microsoft MimeOLE V4.72.2106.4
Organization: Mount Fuji Internet.
Newsgroups: fj.comp.theory,fj.sci.math