// Boost.Geometry (aka GGL, Generic Geometry Library) // Copyright (c) 2007-2012 Barend Gehrels, Amsterdam, the Netherlands. // Copyright (c) 2008-2012 Bruno Lalande, Paris, France. // Copyright (c) 2009-2012 Mateusz Loskot, London, UK. // Use, modification and distribution is subject to the Boost Software License, // Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at // http://www.boost.org/LICENSE_1_0.txt) // #include <algorithm> // for reverse, unique #include <iostream> #include <string> #include <boost/geometry/geometry.hpp> #include <boost/geometry/geometries/point_xy.hpp> #include <boost/geometry/geometries/polygon.hpp> #include <boost/geometry/geometries/adapted/c_array.hpp> #include <boost/geometry/multi/geometries/multi_polygon.hpp> #include <boost/geometry/extensions/algorithms/dissolve.hpp> // dissolve.hpp の中で省略系の namespace が宣言なしに使用されていたので追加 namespace bg = boost::geometry; BOOST_GEOMETRY_REGISTER_C_ARRAY_CS(cs::cartesian) int main(void) { using namespace boost::geometry; typedef model::d2::point_xy<double> point_2d; typedef model::polygon<point_2d> polygon_2d; typedef model::box<point_2d> box_2d; typedef model::multi_polygon<polygon_2d> multi_polygon_2d; // Define a polygon and fill the outer ring. // In most cases you will read it from a file or database polygon_2d poly; { const double coor[][2] = { { -162.277344, -684.941406 }, { -154.300781, -684.707031 }, { -147.291016, -768.253906 }, { -148.601562, -752.630859 }, { -156.675781, -753.292969 }, { -155.425781, -768.546875 } }; assign_points(poly, coor); } // Polygons should be closed, and directed clockwise. If you're not sure if that is the case, // call the correct algorithm correct(poly); // 自己交差を解消するためには、出力先はマルチポリゴンである必要があります。 multi_polygon_2d solved; // ポリゴンを入れて、自己交差を解消し、分解して solved に入れます。 dissolve(poly, solved); // Polygons can be streamed as text // (or more precisely: as DSV (delimiter separated values)) std::cout << dsv(poly) << std::endl; multi_polygon_2d v; try { // intersection(poly, poly, v); では例外が発生しますが… intersection(solved, solved, v); } catch(const std::exception& e) { std::cerr << e.what() << std::endl; } // 大丈夫! std::cout << "Clipped output polygons" << std::endl; for (multi_polygon_2d::const_iterator it = v.begin(); it != v.end(); ++it) { std::cout << dsv(*it) << std::endl; } return 0; }
2016年1月29日金曜日
boost::geometry 自己交差解消
boost::geometry では、自己交差しているポリゴン図形の入力はエラーとして受け付けません。
関連:boost::geometry でもハマった
とは言っても、人間の手を介して入力される限り、自己交差しているような図形は後を絶ちません。
やっぱり、これを解消する手段は、是非とも欲しいところであります。
参考:http://boost-geometry.203548.n3.nabble.com/How-to-repair-self-intersections-td4025893.html
参考URLによりますと、開発バージョンの中には、extensions というヘッダが構築されておりまして、その中にありました。
2016年1月28日木曜日
subversion svnsync お引越し備忘録
subversion で svnsync コマンドを使って、バックアップ構成を構築していますが、日本語ファイルが不味いのか、たまーに invalid XML なんたらとか吐いて同期が取れない場合があります。
そんな時の対処法。
まずは、元のリポジトリからダンプを取ります。
$ svnadmin dump /var/srv/svn/foo_project > foo_project.svndump自分の環境だと面倒なんで
$ mv foo_project.svndump /var/www/htmlとかしておいて、パソコンから
Z:\svn_back> c:\usr\bin\wget http://svnserv/foo_project.svndumpとファイルをコピーしてきて
Z:\svn_back> svnadmin create foo_project Z:\svn_back> copy pre-revprop-change.bat foo_project\hooks Z:\svn_back> svndmin load foo_project < foo_project.svndump Z:\svn_back> svnsync init file:///foo_project http://svnserv/foo_project --allow-non-emptyってやれば、引っ越し完了です。 foo_project はプロジェクト名に svnserv は subversion のサーバ名に 置き換えてやってみてください。 関連項目: Subversion バックアップ構成
2016年1月19日火曜日
ウィンドウズのバッチファイルで曜日を取得する
参考:バッチで日付の操作
Linux でシェルスクリプトを書くよりも、Windows のバッチファイルは曲者で苦労します。
今回は、定期で PostgreSQL のバックアップファイルをとりたいので、曜日でローテションする事を考えました。
@echo off REM 日付の曜日を求める REM 日付はYYYY/MM/DD 形式とする。結果は環境変数 yobi へ返す。 REM 引数がないときは本日とする。 if "%1"=="" ( set orgdate=%date:~-10,10% ) else ( set orgdate=%1 ) :年月日の分割 set yy=%orgdate:~-10,4% set mm=%orgdate:~-5,2% set dd=%orgdate:~-2,2% set dayfile=%yy%%mm%%dd% :月日の数値化(8進数対策) set /a mm=1%mm%-100 set /a dd=1%dd%-100 if "%mm%" LEQ "2" (set /a yy=yy-1&&set /a mm=mm+12) set /a ans=yy + yy/4 - yy/100 + yy/400 + (13*mm+8)/5 + dd set /a wday=ans %% 7 if %wday%==0 ( set youbi=日曜日 set syoubi=日 ) else if %wday%==1 ( set youbi=月曜日 set syoubi=月 ) else if %wday%==2 ( set youbi=火曜日 set syoubi=火 ) else if %wday%==3 ( set youbi=水曜日 set syoubi=水 ) else if %wday%==4 ( set youbi=木曜日 set syoubi=木 ) else if %wday%==5 ( set youbi=金曜日 set syoubi=金 ) else if %wday%==6 ( set youbi=土曜日 set syoubi=土 ) :echo %wday% :echo %youbi%バックアップは、こんな感じ
REM 環境変数のスコープをバッチ内に限定 Setlocal set PGPASSWORD=%1% set CURPATH=%~dp0 REM PostgreSQL インストール・ディレクトリ set PGPATH=C:\Program Files\PostgreSQL\9.4\bin REM バックアップ先ディレクトリ set BKDIR=C:\DatabaseBackup call %CURPATH%youbi.bat REM mydb のバックアップを取る "%PGPATH%\pg_dump.exe" -h localhost -p 5432 -U postgres -Fc -v -f%BKDIR%\%youbi%backup.dmp mydb 2> %BKDIR%\%youbi%backup.log :"%PGPATH%\pg_dump.exe" -h localhost -p 5432 -U postgres -Fc -v -f%BKDIR%\%dayfile%backup.dmp mydb 2> %BKDIR%\%dayfile%backup.log古いファイルを削除する手段がわかった
set BKDIR=C:\DatabaseBackup forfiles /p %BKDIR% /m "*.dmp" /d -30 /c "cmd /c del /Q @file" forfiles /p %BKDIR% /m "*.log" /d -30 /c "cmd /c del /Q @file"
登録:
投稿 (Atom)