自己交差ポリゴンを分割する
どういうことかというとこういうことをやりたいんです
WPFの画面ですが、左側は5点で構成されているポリゴンです
FillRuleがEvenOddになっているので偶数回重なっているところは塗りつぶさないようになってます
んで、これを右側のように5個のポリゴンに分けたいんです
自己交差ポリゴンに対応していないようなうんこソフトに対応するためしょーがない、やらなきゃいけない
Clipper
今更車輪の再発明してできの悪いわっか作ってもしょうがないのでググりますとでてきますよすごいライブラリ
Clipper - an open source freeware polygon clipping library
クリッピングの便利ライブラリらしいですよ。URLにdelphiとか入っていますがC#用もあります
このクラスの中に
//------------------------------------------------------------------------------ // SimplifyPolygon functions ... // Convert self-intersecting polygons into simple polygons //------------------------------------------------------------------------------ public static Paths SimplifyPolygon(Path poly, PolyFillType fillType = PolyFillType.pftEvenOdd)
まさにそのものがあります
呼ぶのも簡単で
var p = new List<IntPoint>(); foreach (var point in _clickPoints) p.Add(new IntPoint(point.X, point.Y)); // _clickPointsに元の座標が入っている var sp = ClipperLib.Clipper.SimplifyPolygon(p);
SimplifyPolygonでポリゴン単位に分けてくれるのであとはそれを好き勝手すればいいんです
ということで
確認するためにポリゴン毎に色を分けて表示するようにしてみましたがいい感じに分かれてくれてます
めでたしめでたし
追記
ClipperはNuGetででてきますね
Surface Laptop のWindows 10 Proが認証失敗して困った話
スクショとか取ってなかったので記憶を頼りに箇条書き風な感じで
経緯
買った
Surface Laptopだよ
入っているOSはWindows 10 Sだよ
使ったことないよ
Proにアップグレードした
今月まで無料で上げられるよ
Windows Updateかけまくった
それはそれはかけまくったさ
失敗するやつがでてきた
たしかKB4088776だったはず
再起動しろっていうからするんだけど、何度再起動しても再起動しろって言ってきた
どうせ1803入れたら消えるだろうからそれまで放っておこうと思ったんだけど、ほかの奴らがそれに引きずられてうまく入らなくてこまった(.Net 3.5とか)
初期状態に戻した
いろいろ試したけどどうしてもKB4088776が入らなくて初期化した方が速いと判断して初期化
Windows Updateかけまくった
全部できた
ライセンス認証しろって言われた
そんなばかな
いろいろためした
Microsoftアカウントに紐づいたやつは別のWindowsで使われているらしい。それはこのLaptopのはずなのに
あきらめてサポートに電話した
つながるまでが第一関門
サポートの人がやってくれたこと
リモートアシスタンスでつないであとはお任せ
お、おまえまだいたのか!
はじめて使ったよ
マザーボードからライセンスキーを引っ張る
って言ってた
マザーボードにそんなもん入ってるんだ
コマンドは多分これ
とってきたキーで認証
Windows 10 S になった!!!!
10 Sになったのがライセンス認証画面のWindows エディションの文字だけなのか、動きもそうなのかすごく気になったけどリモート中なので試せなかった。残念
あとはストアからProに上げるだけ
ストアのアカウント情報が変だったっぽくてはじめは有料ボタンしかなかったけど、アカウント情報確認した後にもう一度ストア開いたらちゃんと無料で更新ボタンになってた
押したら特に何かが動くということもなく、ライセンス認証画面がWindows 10 Proになってた
感想
Win10の認証は普段は楽させてもらっているので文句は特にないです
サポートは通話先(電話が切れた時用)の確認が面倒だと思った
電話番号聞いて、名前聞いて、メールアドレス聞いて、ってのが面倒
電話番号は掛けている携帯の番号引っ張ってこれそうなものだし、その電話番号からMicrosoftのアカウント引っ張ってこれそうだから自動で出来そうなものなんだけど、なんかプライバシー的なリスクでもあるのかな?
とりあえずやっと普通に使えるLaptopになりました
あと後でライセンスキー入れて10 Sにしたいと思いつつも、トラブル面倒なのできっとやりません
Laptop持っている暇な人いたら試してほしいです
Python勉強する その2
危うく1回で終わりそうだった
Pythonの入門記事ググって試したことを書きなぐってるだけです。もうすぐ飽きます
過去はこれ
変数の宣言
いま流行りのvar
とかいらないっぽいです
a = 1 b = 2.3 c = a + b print (c) # 3.3
docstring
定義の上にダブルクォーテーション3つで囲った文字列を入れておくといいらしい
参照は__doc__
クラスの定義とかメソッドの説明とか書くみたい
"""Hoge""" print(__doc__) # Hoge
ブロック
コードのインデント(スペースの数)で区別するっぽい。
if a == 1: print("a = 1") print("まだifの中") print("ifの外")
タブとスペースが混在すると死にそうだけど、Visual Studioではタブはデフォルトでスペース4個になるっぽい
関数の宣言
def ~ : って感じで書く
def add(x,y): """足すよ""" a = x + y; return x + y print(add.__doc__) # 足すよ print(add(3,4)) # 7
ラムダ式
lambda
で行ける
func = lambda x, y : x + y print(func(3,4)) # 7
クラス
class ClassA: """Example class""" def __init__(self, arg): print("init") self.name = arg def __del__(self): print("del") def __str__(self): return "ClassA " + self.name def greet(self): print("Hello") print(ClassA.__doc__) # Example class a = ClassA("abc") # init a.greet() # Hello print(a) # ClassA abc del a # del
__init__
コンストラクタ
__del__
デストラクタ
__str__
ToString()
__name__ と __main__
if __name__ == '__main__': print('Entry point')
って覚えておけばいいんじゃね?
飽きなければ続きます