楕円を投影
どっかに浮かんでいる楕円をどっかの平面に投影するとどうなるの?
というのを聞かれたので概略を。
平面の表現
平面の法線向き
原点からの距離h
として、平面をと陰関数形式で表す。
楕円を平面に投影
点qを平面Pに投影した点q'はとなる。
楕円の各点を投影するととなる。
内積の線形性より
である。
ここで、
とおくと、投影した楕円E'は新たなp', x', y'を用いてと書ける。
投影楕円E'の法線向きは投影された平面Pの法線向きmとなる。
p'は元の楕円の中心点pを単に平面Pに投影したもの等しい。
しかし、ここでのは必ずしも長さ1でなく、必ずしも直交しないため適切な長径向き・長径・短径を求め直す必要がある。
長径・短径向きの直交化
ここでは楕円中心点から楕円上の点までのベクトルをと表す。
uはax'に、vはby'に相当する。
長径・短径はpの長さの最大値・最小値であるから、極値となるtを求めることで長径または短径を見つけることができる。長さのままでは扱いづらいため二乗を用いる。
pの長さの二乗
をパラメータtで微分し0と等しいときのtを求める。
変形して
tについてまとめると
となる。
またはがそれぞれ長径または短径におけるパラメータとなる。
ここから長径向き・長径・短径を求めることで最初に示した形式に一致する表現を得ることができる。
TODO
図を書く
ARC004_C
AtCoder Regular Contest #004 C問題
http://arc004.contest.atcoder.jp/tasks/arc004_3
ケアレスミス記念&はてダ記念。
僕の解法(?)はこんなのだった。
1からNまでの平均値=
足し忘れ数M=
となるNを見つける。
このままではNの範囲がわからないので不等式を変形して範囲を求める。
下限
上限
というわけで下限と上限が求まった。
よくみると範囲はめちゃくちゃ狭い。
ところが下限の計算をミスっての線形探索になってしまい、どこで計算を削ろうかと考えてしまいタイムアップだった。もったいない。
てすてす
コード
main = putStrLn "Hello, World!"
数式
やばい楽い。
適応的しきい値
借りた本をスキャンしたんだけれど 真ん中のへこんだ部分がどうしても暗くなる。
本の印刷のコントラストが適度に低くて しかも本が適度に分厚いと 真ん中のへこんだ部分がより大きく暗くなるので 全体の文字がつぶれないようにがんばると どうしてもこうなる。
そこで適応的にしきい値かけるソフトを探したんだけれど openCVに標準で関数があったので テキトーに書いてみた。 ていうか「適応的しきい値」とか「適応的二値化」ってマイナーなのかしら あんまりソフトがひっかからんかったような気がする。
適応的しきい値をかけるとこういう感じになってくれてとてもうれしい。
参考 http://opencv.jp/sample/filter_and_color_conversion.html#threshold
#include <cv.h> #include <highgui.h> int main (int argc, char **argv) { IplImage *src_img = 0, *dst_img; IplImage *src_img_gray = 0; //args // inputfile outputfile blocksize thresholdparameter char *outfile="out.jpg"; int block=5; double param=5; if (argc >= 2) { src_img = cvLoadImage(argv[1], CV_LOAD_IMAGE_COLOR); } if (src_img == 0) { return -1; } if (argc >= 3) { outfile=argv[2]; } if(argc>=4) { int b=atoi(argv[3]); if(b<3)b=3; b/=2; b*=2; b++; block=b; } if(argc>=5) { double p=atof(argv[4]); param=p; } dst_img = cvCreateImage(cvGetSize (src_img), IPL_DEPTH_8U, 1); src_img_gray = cvCreateImage(cvGetSize (src_img), IPL_DEPTH_8U, 1); cvCvtColor(src_img, src_img_gray, CV_BGR2GRAY); cvAdaptiveThreshold(src_img_gray, dst_img, 255, CV_ADAPTIVE_THRESH_MEAN_C, CV_THRESH_BINARY, block, param); cvSaveImage(outfile,dst_img); cvReleaseImage(&src_img); cvReleaseImage(&src_img_gray); cvReleaseImage(&dst_img); return 0; }