Cubic Bézier Curve
mikanplus
2020-02-21
はじめに
2*1) 当時、周りの人はEagleフリー版等を使っていた。最近はEagle、KiCAD、MBE等が使われているかと。
【当時の目標】
▸ お絵描き基板CAD
▸ ベジェ曲線が使える
▸ アンチエイリアシングがかかる
▸ Undo、Redo
▸ PCBEのファイルのインポート
▸ ガーバ出力
▸ 入れ子構造のグループ化
▸ レイヤー機能
2008年当時、ガーバ出力できるフリーの基板CAD*1としてPCBEを使用していたが、
Undo/Redoがない等の不満からmikan基板CADを作成
本日のテーマ
3
mikan基板CADも製作から10年以上が経過し、機能的不足感が否めない
当時使った開発環境のTurbo C++はもはや入手不可に
【今の目標】
▸ 図形のブーリアン演算
▸ 各種カーソルスナップ(グリッド、ポイント、
垂線、交点、直線上、割り出し角度)
▸ 寸法入力補助
▸ Visual C++によるフルスクラッチ
▸ アウトライン化
▸ ネットリスト対応
▸ Eagleライブラリインポート?
▸ (FEMによる電磁界解析?)
本日のテーマ: ベジェ曲線図形に対するブーリアン演算
(3次)ベジェ曲線の基本
4
P0
P1
P2
P3
P5P7
P8
P9
P3
t0
1-t0
t0
1-t0P0
P1
P2
P5P7
P8
P9
P6
P4
P6
P4
(1) 頂点P0(P3)と制御点P1(P2)を結ぶ直線は接ベクトルになる
(2) 頂点と制御点を結ぶ直線をt0:1-t0で分割していった点P9はベジェ曲線を
t=t0で分割した分割点になる
(3) 頂点P0,P3と制御点P1,P2からなる四角形に対して凸包性を有する
(4) アフィン不変性を有する
𝑥 𝑡 = 1 − 𝑡 3 𝑥0 + 3 1 − 𝑡 2 𝑡𝑥1 + 3 1 − 𝑡 𝑡2 𝑥2 + 𝑡3 𝑥3
𝑦 𝑡 = 1 − 𝑡 3
𝑦0 + 3 1 − 𝑡 2
𝑡𝑦1 + 3 1 − 𝑡 𝑡2
𝑦2 + 𝑡3
𝑦3
ブーリアン演算への道
5
ベジェ曲線と直線の交点計算
図形の内外判定
ブーリアン演算
アウトライン化 オフセットパスの導出
ベジェ曲線同士の交点計算
図形 MS PowerPoint Illustrator
? ?
? ?
図形の内外判定
6
ベクトル図形で、ある領域を塗りつぶすか否かはどうやって決めているのか?
図形 MS PowerPoint (Even-odd) Illustrator*2 (Non-zero)
図形の内外判定(ワインディング規則)
7
一般にEven-odd ruleとNon-zero winding ruleが使われる
ベクトル図形で、ある領域を塗りつぶすか否かはどうやって決めているのか?
*2) 初期設定における動作
図形の内外判定
8
1
2
1
2
+1
+1
+1
-1
n=0 (zero)
n=2 (non-zero)
n=2 (even)
n=2 (even)
Even-odd rule
半直線と図形の交差回数が奇数の時、領域を塗りつぶす
Non-zero winding rule
半直線に対して図形が左から右に交差した時に+1、右から左に交差した時-1
して最終的に≠0だった場合(Non-zero)、領域を塗りつぶす
内外判定にはベジェ曲線と直線の交差判定が必要
ベジェ曲線と直線の交点(1)
9
P3
P0
P1
P2
直線の方程式に3次方程式を代入して
tに関する3次方程式を解いてもよいが…
𝑦 = 𝑘𝑥 + 𝑐
𝑥 = 1 − 𝑡 3 𝑥0 + 3 1 − 𝑡 2 𝑡𝑥1 + 3 1 − 𝑡 𝑡2 𝑥2 + 𝑡3 𝑥3
𝑦 = 1 − 𝑡 3 𝑦0 + 3 1 − 𝑡 2 𝑡𝑦1 + 3 1 − 𝑡 𝑡2 𝑦2 + 𝑡3 𝑦3
= 𝑦3 − 3𝑦2 + 3𝑦1 − 𝑦0 𝑡3
+ 3 𝑦2 − 2𝑦1 + 𝑦0 𝑡2
+ 3 𝑦1 − 𝑦0 𝑡 + 𝑦0
𝑘 𝑥3 − 3𝑥2 + 3𝑥1 − 𝑥0 𝑡3 + 3 𝑥2 − 2𝑥1 + 𝑥0 𝑡2 + 3 𝑥1 − 𝑥0 𝑡 + 𝑥0 + 𝑐
まぁ、それほど複雑な式ではないので解ける
𝑦 = 𝑘𝑥 + 𝑐
(1) アフィン変換Aを用いて4つの制御点を直線をX軸とする座標系に変換する
(2) 変換後のベジェ曲線は、交点をY’に関する3次方程式を解くことで求められる
(3) 3次方程式の解をカルダノの公式で求める*3
ベジェ曲線と直線の交点(2)
10
P3
P0
P1
P2
Y’
X’
L
Y’
t
1.00.0
Y0
Y3
A
𝑨 =
cos 𝜃 −sin 𝜃
sin 𝜃 cos 𝜃
=
𝑥𝑖 𝑦𝑖
−𝑦𝑖 𝑥𝑖
アフィン不変性を使って、Yに関する単一の3次方程式におとしこむこともできる
*3) 4次方程式までは代数的解法があるそうです
𝑦 = 𝑘𝑥 + 𝑐
0 = 1 − 𝑡 3 𝑦′0 + 3 1 − 𝑡 2 𝑡𝑦′1 + 3 1 − 𝑡 𝑡2 𝑦′2 + 𝑡3 𝑦′3
ブーリアン演算への道
11
ベジェ曲線と直線の交点計算
図形の内外判定
ブーリアン演算
アウトライン化 オフセットパスの導出
ベジェ曲線同士の交点計算
アウトライン化
12
ストロークパスのアウトライン化の基本は、オフセットパスの導出
※オフセットパスはツールパスの算出でも使われます
アウトラインパスストロークパス
ストロークパスはブーリアン演算の前にアウトラインパスに変換する必要がある
offset-path
アウトライン化(オフセットパス)
13
ベジェ曲線P(t)のオフセットパスP’(t)は、単純な制御点の法線方向移動では
実現不可。また必ずしも同数の制御点でオフセットパスを表現できるとは限らない
(1) 分割点をオフセットして
リファレンスポイントq1~qnを算出
P3
P0
P1
P2
P0’ P3’
q1
qn
アウトライン化(オフセットパス)
14
ベジェ曲線P(t)のオフセットパスP’(t)は、単純な制御点の法線方向移動では
実現不可。また必ずしも同数の制御点でオフセットパスを表現できるとは限らない
(1) 分割点をオフセットして
リファレンスポイントq1~qnを算出
P3
P0
P1
P2
P0’ P3’
q1
qn-1
P3
P0
P1
P2
P0’ P3’
q1
qn
P1’=P0’+C0v0
P2’=P3’+C1v1
(2) 比例定数C0,C1を用いて
制御点P1’とP2’を定義
アウトライン化(オフセットパス)
15
ベジェ曲線P(t)のオフセットパスP’(t)は、単純な制御点の法線方向移動では
実現不可。また必ずしも同数の制御点でオフセットパスを表現できるとは限らない
(1) 分割点をオフセットして
リファレンスポイントq1~qnを算出
P3
P0
P1
P2
P0’ P3’
q1
qn-1
P3
P0
P1
P2
P0’ P3’
q1
qn
P1’=P0’+C0v0
P2’=P3’+C1v1
(2) 比例定数C0,C1を用いて
制御点P1’とP2’を定義
𝑄 =
𝑖=1
𝑛
𝑃′
𝑡𝑖 − 𝑞𝑖
2
(3) ベジェ曲線P0’~P3’に関して次式を
最小化するC0,C1を計算する*4
*4) 今回は最小2乗線形Taylor微分補正法で実装しました
アウトライン化(オフセットパス)
16
ベジェ曲線P(t)のオフセットパスP’(t)は、単純な制御点の法線方向移動では
実現不可。また必ずしも同数の制御点でオフセットパスを表現できるとは限らない
(4) 誤差Qが大きい場合、ベジェ曲線P(t)
を2分割してオフセットパスを計算
(1) 分割点をオフセットして
リファレンスポイントq1~qnを算出
P3
P0
P1
P2
P0’ P3’
q1
qn-1
P3
P0
P1
P2
P0’ P3’
q1
qn
P1’=P0’+C0v0
P2’=P3’+C1v1
(2) 比例定数C0,C1を用いて
制御点P1’とP2’を定義
𝑄 =
𝑖=1
𝑛
𝑃′
𝑡𝑖 − 𝑞𝑖
2
(3) ベジェ曲線P0’~P3’に関して次式を
最小化するC0,C1を計算する*4
P6
P0
P3
P1 P2
P4 P5*4) 今回は最小2乗線形Taylor微分補正法で実装しました
アウトライン化(テスト結果)
17
■ パス分割あり■ パス分割なし
オフセットパス生成時のパス分割有無による影響を比較
リファレンスポイント数9、パス分割閾値:オフセット量の5%
ブーリアン演算への道
18
ベジェ曲線と直線の交点計算
図形の内外判定
ブーリアン演算
アウトライン化 オフセットパスの導出
ベジェ曲線同士の交点計算
ベジェ曲線同士の交点
19
𝑥 𝑠 = 1 − 𝑠 3 𝑥4 + 3 1 − 𝑠 2 𝑠𝑥5 + 3 1 − 𝑠 𝑠2 𝑥6 + 𝑠3 𝑥7
𝑦 𝑠 = 1 − 𝑠 3
𝑦4 + 3 1 − 𝑠 2
𝑠𝑦5 + 3 1 − 𝑠 𝑠2
𝑦6 + 𝑠3
𝑦7
𝑥 𝑡 = 1 − 𝑡 3 𝑥0 + 3 1 − 𝑡 2 𝑡𝑥1 + 3 1 − 𝑡 𝑡2 𝑥2 + 𝑡3 𝑥3
𝑦 𝑡 = 1 − 𝑡 3
𝑦0 + 3 1 − 𝑡 2
𝑡𝑦1 + 3 1 − 𝑡 𝑡2
𝑦2 + 𝑡3
𝑦3
さすがにこれを直接解くのはきつい…
ブーリアン演算には、ベジェ曲線同士の交点計算が必須
ベジェ曲線同士の交点は最大9点→次数は9次以上
P7P0
P3
P4
ベジェ曲線同士の交点(Bezier-clipping法)
20
Bezier-clipping法
ベジェ曲線の凸包性を利用した手法で、囲い込み法の2次元版とも考えられる
P3
P0
P1
P2
P4
P5
P6
P7
Path1
Path2
(1) 初期状態
ベジェ曲線同士の交点(Bezier-clipping法)
21
Bezier-clipping法
ベジェ曲線の凸包性を利用した手法で、囲い込み法の2次元版とも考えられる
P3
P0
P1
P2
P4
P5
P6
P7
P3
P0
P1
P2
P4
P7
Path1
Path2
(2) Path1の凸包でPath2をクリップ(1) 初期状態
ベジェ曲線同士の交点(Bezier-clipping法)
22
Bezier-clipping法
ベジェ曲線の凸包性を利用した手法で、囲い込み法の2次元版とも考えられる
P3
P0
P1
P2
P4
P5
P6
P7
P3
P0
P1
P2
P4
P7
Path1
P3
P0
P’4
P’7
P’5
P’6
Path2
(3) Path2の凸包でPath1をクリップ
(2) Path1の凸包でPath2をクリップ(1) 初期状態
ベジェ曲線同士の交点(Bezier-clipping法)
23
Bezier-clipping法
ベジェ曲線の凸包性を利用した手法で、囲い込み法の2次元版とも考えられる
P3
P0
P1
P2
P4
P5
P6
P7
P3
P0
P1
P2
P4
P7
P’3
P’0
P’4
P’7
Path1
P3
P0
P’4
P’7
P’5
P’6
Path2
(4) Path1の凸包でPath2をクリップ(3) Path2の凸包でPath1をクリップ
(2) Path1の凸包でPath2をクリップ(1) 初期状態
ブーリアン演算への道
24
ベジェ曲線と直線の交点計算
図形の内外判定
ブーリアン演算
アウトライン化 オフセットパスの導出
ベジェ曲線同士の交点計算
ブーリアン演算(加算)
25
2つのパスを加算したベジェ曲線を求めたい
→交点で分割されたパスをアウトラインになるように繋ぎ変えればOK
ブーリアン演算(加算)
26
2つのパスを加算したベジェ曲線を求めたい
→交点で分割されたパスをアウトラインになるように繋ぎ変えればOK
パスの交点では
(a) 流入する枝が2本、流出する枝が2本存在する
→たどるのは自パスか、相手パスのどちらか一方
(b) 交点の流入前後で、相手パスの内外境界をまたぐ
→内外境界をまたがないパスをたどればよさそう
Greiner-Hormann clipping algorithm
交点で相手パスに乗り換えるようにパスをたどる
ブーリアン演算(加算)
27
(1) パスの交点を計算したのち、
交点でパスを分割
ブーリアン演算(加算)
28
(1) パスの交点を計算したのち、
交点でパスを分割
(2) 交点で乗り換えながら
分割パスをトレースする
ブーリアン演算(加算)
29
(3) 再度、交点で乗り換えながら
分割パスをトレースする
(1) パスの交点を計算したのち、
交点でパスを分割
(2) 交点で乗り換えながら
分割パスをトレースする
ブーリアン演算(加算)
30
(3) 再度、交点で乗り換えながら
分割パスをトレースする
(4) 不要なパスを削除する
(1) パスの交点を計算したのち、
交点でパスを分割
(2) 交点で乗り換えながら
分割パスをトレースする
ブーリアン演算(減算)
31
(1) 切り取る側のポイントの並びを逆転
して、パスを交点分割
ブーリアン演算(減算)
32
(1) 切り取る側のポイントの並びを逆転
して、パスを交点分割
(2) 交点で乗り換えながら
分割パスをトレースする
ブーリアン演算(減算)
33
(1) 切り取る側のポイントの並びを逆転
して、パスを交点分割
(2) 交点で乗り換えながら
分割パスをトレースする
(3) 再度、交点で乗り換えながら
分割パスをトレースする
ブーリアン演算(減算)
34
(1) 切り取る側のポイントの並びを逆転
して、パスを交点分割*5
(2) 交点で乗り換えながら
分割パスをトレースする
(3) 再度、交点で乗り換えながら
分割パスをトレースする
(4) 不要なパスを削除する
*5) ちなみに図形の積を求めるときは、両方のパスの並びを逆転します
ブーリアン演算(不要パスの判定)
35
ステップ(4)で削除した不要パスはどうやって決めるのか?
n=0の時計周りのパスと、n=1の反時計回りのパスのみ残せばよさそう
n=0 n=1
+1
-1
+1
n=0
+1
n=1
n=0
ブーリアン演算への道
36
ベジェ曲線と直線の交点計算
図形の内外判定
ブーリアン演算
アウトライン化 オフセットパスの導出
ベジェ曲線同士の交点計算
おわりに
37
ベジェ曲線におけるブーリアン演算に係る、アルゴリズム諸々を紹介しました
ブーリアン演算
▸ パスを交点分割したのち、
交点で相手パスに乗り換えるようにパスをたどる
→ Greiner-Hormann clipping algorithm
ベクトル図形の内外判定
▸ Even-odd ruleと、Non-zero winding ruleの2種類がある
▸ 内外判定にはベジェ曲線と直線の交点計算が必要
ベジェ曲線と直線の交点計算
▸ 交点計算は3次方程式の解に帰着できる
アウトライン化
▸ アウトライン化の基本はオフセットパス
ベジェ曲線同士の交点計算
▸ Bezier-clipping法が有効

More Related Content

PDF
Sparse Codingをなるべく数式を使わず理解する(PCAやICAとの関係)
PDF
蛇を埋葬する(PythonをEmbedする)
PDF
機器學習應用於蔬果辨識
PDF
バイナリニューラルネットとハードウェアの関係
PDF
C#×LLVM=アセンブラ!? 〜詳説・Burstコンパイラー〜
PDF
[論文紹介] DPSNet: End-to-end Deep Plane Sweep Stereo
PDF
요즘 유행하는 AI 나도 해보자 (feat. CoreML)
PDF
Transformerを用いたAutoEncoderの設計と実験
Sparse Codingをなるべく数式を使わず理解する(PCAやICAとの関係)
蛇を埋葬する(PythonをEmbedする)
機器學習應用於蔬果辨識
バイナリニューラルネットとハードウェアの関係
C#×LLVM=アセンブラ!? 〜詳説・Burstコンパイラー〜
[論文紹介] DPSNet: End-to-end Deep Plane Sweep Stereo
요즘 유행하는 AI 나도 해보자 (feat. CoreML)
Transformerを用いたAutoEncoderの設計と実験

What's hot (20)

PDF
第126回 ロボット工学セミナー 三次元点群と深層学習
PPTX
Emcpp0506
PDF
2値化CNN on FPGAでGPUとガチンコバトル(公開版)
PDF
FPGAを用いたEdge AIの現状
PDF
究極のゲーム用通信プロトコルを探せ!
PPTX
人工知能研究のための視覚情報処理
PDF
新しい並列for構文のご提案
PPTX
多目的遺伝的アルゴリズム
PDF
【論文読み会】Deep Clustering for Unsupervised Learning of Visual Features
PDF
今日からできる!簡単 .NET 高速化 Tips
PDF
DNNコンパイラの歩みと最近の動向 〜TVMを中心に〜
PDF
パターン認識第9章 学習ベクトル量子化
PDF
【CEDEC2018】CPUを使い切れ! Entity Component System(通称ECS) が切り開く新しいプログラミング
PDF
通信規格OSC(OpenSoundControl)
PPTX
Python開発は仮想化しろ
PDF
Automated Library with OpenBiblio - myLib
PDF
ソフトシンセを作りながら学ぶPythonプログラミング
PDF
実装レベルで学ぶVQVAE
PDF
TensorFlow計算グラフ最適化処理
PDF
第14回 配信講義 計算科学技術特論A(2021)
第126回 ロボット工学セミナー 三次元点群と深層学習
Emcpp0506
2値化CNN on FPGAでGPUとガチンコバトル(公開版)
FPGAを用いたEdge AIの現状
究極のゲーム用通信プロトコルを探せ!
人工知能研究のための視覚情報処理
新しい並列for構文のご提案
多目的遺伝的アルゴリズム
【論文読み会】Deep Clustering for Unsupervised Learning of Visual Features
今日からできる!簡単 .NET 高速化 Tips
DNNコンパイラの歩みと最近の動向 〜TVMを中心に〜
パターン認識第9章 学習ベクトル量子化
【CEDEC2018】CPUを使い切れ! Entity Component System(通称ECS) が切り開く新しいプログラミング
通信規格OSC(OpenSoundControl)
Python開発は仮想化しろ
Automated Library with OpenBiblio - myLib
ソフトシンセを作りながら学ぶPythonプログラミング
実装レベルで学ぶVQVAE
TensorFlow計算グラフ最適化処理
第14回 配信講義 計算科学技術特論A(2021)
Ad

Similar to The boolean operation for Cubic Bezier (6)

PDF
2章グラフ理論スピード入門
PDF
競技プログラミングでの線型方程式系
PDF
SFC Design theory 2012 6/13
PPTX
CG2013 02
PDF
自然言語処理に適した ニューラルネットのフレームワーク - - - DyNet - - -
2章グラフ理論スピード入門
競技プログラミングでの線型方程式系
SFC Design theory 2012 6/13
CG2013 02
自然言語処理に適した ニューラルネットのフレームワーク - - - DyNet - - -
Ad

The boolean operation for Cubic Bezier