fork download
  1. // ConvexSquare.cpp : アプリケーションのエントリ ポイントを定義します。
  2. //
  3.  
  4. #define WIN32_LEAN_AND_MEAN // Windows ヘッダーからほとんど使用されていない部分を除外する
  5. // Windows ヘッダー ファイル
  6. #include <windows.h>
  7. // C ランタイム ヘッダー ファイル
  8. #include <tchar.h>
  9.  
  10. #include <iterator>
  11. #include <algorithm>
  12. #include <vector>
  13.  
  14. std::vector<int> v{ 136, 577, 110, 927, 472, 199, 157, 808, 388, 598, 94, 31, 388, 157, 325, 409, 787, 897, 850, 598 };
  15.  
  16. struct vec2d {
  17. int x, y;
  18.  
  19. vec2d& operator=(const vec2d& ref) {
  20. x = ref.x;
  21. y = ref.y;
  22. return *this;
  23. }
  24.  
  25. bool operator==(const vec2d& ref) const {
  26. return x == ref.x && y == ref.y;
  27. }
  28.  
  29. bool operator!=(const vec2d& ref) const {
  30. return !operator==(ref);
  31. }
  32.  
  33. vec2d operator-(const vec2d& ref) const {
  34. return { x - ref.x, y - ref.y };
  35. }
  36. vec2d operator+(const vec2d& ref) const {
  37. return { x + ref.x, y + ref.y };
  38. }
  39.  
  40. int dot(const vec2d& ref) const {
  41. return x * ref.y + y * ref.x;
  42. }
  43.  
  44. int cross(const vec2d& ref) const {
  45. return x * ref.y - ref.x * y;
  46. }
  47. };
  48.  
  49. using Vertices = std::vector<vec2d>;
  50.  
  51. auto getVertices()
  52. {
  53. auto i = std::begin(v);
  54. auto e = i; std::advance(e, std::size(v) - std::size(v) % 2);
  55. Vertices result;
  56. while (i != e) {
  57. result.push_back({ *i, *std::next(i) });
  58. std::advance(i, 2);
  59. }
  60. return result;
  61. }
  62.  
  63. int findStartPoint(const Vertices& vertices)
  64. {
  65. auto p = 0;
  66. auto x = vertices[p].x, y = vertices[p].y;
  67. for (size_t i = 0; i < std::size(vertices); i++) {
  68. auto diff = y - vertices[i].y;
  69. if (diff > 0) {
  70. y = vertices[i].y;
  71. x = vertices[i].x;
  72. p = i;
  73. }
  74. else if (diff == 0 && x > vertices[i].x) {
  75. x = vertices[i].x;
  76. p = i;
  77. }
  78. }
  79. return p;
  80. }
  81.  
  82. auto getConvexHull(const Vertices& vertices)
  83. {
  84. Vertices result;
  85. if (std::size(vertices) == 0) {
  86. return result;
  87. }
  88. auto a = findStartPoint(vertices);
  89. for (;;) {
  90. result.push_back(vertices[a]);
  91. auto b = 0;
  92. for (size_t i = 1; i < std::size(vertices); i++) {
  93. auto c = i;
  94. if (vertices[b] == vertices[a]) {
  95. b = c;
  96. }
  97. else {
  98. vec2d A = vertices[a];
  99. vec2d B = vertices[b];
  100. vec2d C = vertices[c];
  101. int v = (B - A).cross(C - A);
  102. if (v > 0) {
  103. b = c;
  104. }
  105. }
  106. }
  107. a = b;
  108. if (result[0] == vertices[a]) {
  109. break;
  110. }
  111. }
  112.  
  113. return result;
  114. }
  115.  
  116. auto getInclusionCircle(const Vertices& vertices)
  117. {
  118. Vertices result;
  119.  
  120. return result;
  121. }
  122.  
  123. // グローバル変数:
  124. HINSTANCE hInst; // 現在のインターフェイス
  125. WCHAR szTitle[]=_T("ConvexSquare"); // タイトル バーのテキスト
  126. WCHAR szWindowClass[]=_T("CONVEXSQUARE"); // メイン ウィンドウ クラス名
  127.  
  128. // このコード モジュールに含まれる関数の宣言を転送します:
  129. ATOM MyRegisterClass(HINSTANCE hInstance);
  130. BOOL InitInstance(HINSTANCE, int);
  131. LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);
  132. INT_PTR CALLBACK About(HWND, UINT, WPARAM, LPARAM);
  133.  
  134. int APIENTRY wWinMain(_In_ HINSTANCE hInstance,
  135. _In_opt_ HINSTANCE hPrevInstance,
  136. _In_ LPWSTR lpCmdLine,
  137. _In_ int nCmdShow)
  138. {
  139. UNREFERENCED_PARAMETER(hPrevInstance);
  140. UNREFERENCED_PARAMETER(lpCmdLine);
  141.  
  142. // TODO: ここにコードを挿入してください。
  143. auto vertices = getVertices();
  144. auto convex_hull = getConvexHull(vertices);
  145.  
  146. // グローバル文字列を初期化する
  147. MyRegisterClass(hInstance);
  148.  
  149. // アプリケーション初期化の実行:
  150. if (!InitInstance (hInstance, nCmdShow))
  151. {
  152. return FALSE;
  153. }
  154.  
  155. MSG msg;
  156.  
  157. // メイン メッセージ ループ:
  158. while (GetMessage(&msg, nullptr, 0, 0))
  159. {
  160. TranslateMessage(&msg);
  161. DispatchMessage(&msg);
  162. }
  163.  
  164. return (int) msg.wParam;
  165. }
  166.  
  167.  
  168.  
  169. //
  170. // 関数: MyRegisterClass()
  171. //
  172. // 目的: ウィンドウ クラスを登録します。
  173. //
  174. ATOM MyRegisterClass(HINSTANCE hInstance)
  175. {
  176. WNDCLASSEXW wcex;
  177.  
  178. wcex.cbSize = sizeof(WNDCLASSEX);
  179.  
  180. wcex.style = CS_HREDRAW | CS_VREDRAW;
  181. wcex.lpfnWndProc = WndProc;
  182. wcex.cbClsExtra = 0;
  183. wcex.cbWndExtra = 0;
  184. wcex.hInstance = hInstance;
  185. wcex.hIcon = LoadIcon(nullptr, IDI_APPLICATION);
  186. wcex.hCursor = LoadCursor(nullptr, IDC_ARROW);
  187. wcex.hbrBackground = (HBRUSH)(COLOR_WINDOW+1);
  188. wcex.lpszMenuName = NULL;
  189. wcex.lpszClassName = szWindowClass;
  190. wcex.hIconSm = LoadIcon(nullptr, IDI_APPLICATION);
  191.  
  192. return RegisterClassExW(&wcex);
  193. }
  194.  
  195. //
  196. // 関数: InitInstance(HINSTANCE, int)
  197. //
  198. // 目的: インスタンス ハンドルを保存して、メイン ウィンドウを作成します
  199. //
  200. // コメント:
  201. //
  202. // この関数で、グローバル変数でインスタンス ハンドルを保存し、
  203. // メイン プログラム ウィンドウを作成および表示します。
  204. //
  205. BOOL InitInstance(HINSTANCE hInstance, int nCmdShow)
  206. {
  207. hInst = hInstance; // グローバル変数にインスタンス ハンドルを格納する
  208.  
  209. HWND hWnd = CreateWindowW(szWindowClass, szTitle, WS_OVERLAPPEDWINDOW,
  210. CW_USEDEFAULT, 0, CW_USEDEFAULT, 0, nullptr, nullptr, hInstance, nullptr);
  211.  
  212. if (!hWnd)
  213. {
  214. return FALSE;
  215. }
  216.  
  217. ShowWindow(hWnd, nCmdShow);
  218. UpdateWindow(hWnd);
  219.  
  220. return TRUE;
  221. }
  222.  
  223. //
  224. // 関数: WndProc(HWND, UINT, WPARAM, LPARAM)
  225. //
  226. // 目的: メイン ウィンドウのメッセージを処理します。
  227. //
  228. // WM_COMMAND - アプリケーション メニューの処理
  229. // WM_PAINT - メイン ウィンドウを描画する
  230. // WM_DESTROY - 中止メッセージを表示して戻る
  231. //
  232. //
  233. LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
  234. {
  235. switch (message)
  236. {
  237. case WM_LBUTTONDOWN:
  238. {
  239. int x = LOWORD(lParam);
  240. int y = HIWORD(lParam);
  241. v.push_back({ x });
  242. v.push_back({ y });
  243. ::InvalidateRect(hWnd, nullptr, true);
  244. }
  245. break;
  246. case WM_RBUTTONDOWN:
  247. {
  248. v.clear();
  249. ::InvalidateRect(hWnd, nullptr, true);
  250. }
  251. break;
  252. case WM_MBUTTONDOWN:
  253. {
  254. std::vector<int> tmp{ 136, 577, 110, 927, 472, 199, 157, 808, 388, 598, 94, 31, 388, 157, 325, 409, 787, 897, 850, 598 };
  255. v.swap(tmp);
  256. ::InvalidateRect(hWnd, nullptr, true);
  257. }
  258. break;
  259. case WM_PAINT:
  260. {
  261. PAINTSTRUCT ps;
  262. HDC hdc = BeginPaint(hWnd, &ps);
  263. // TODO: HDC を使用する描画コードをここに追加してください...
  264.  
  265. ::Rectangle(hdc, 0, 0, 999, 999);
  266.  
  267. {
  268. Vertices vertices = getVertices();
  269. for (auto& v : vertices) {
  270. ::Rectangle(hdc, v.x - 1, v.y - 1, v.x + 1, v.y + 1);
  271. }
  272. }
  273.  
  274. {
  275. Vertices vertices = getConvexHull(getVertices());
  276. if (std::size(vertices) > 0) {
  277. {
  278. for (size_t i = 0; i < std::size(vertices); i++) {
  279. char txt[255];
  280. sprintf_s(txt, 255, "%zu", i);
  281. ::TextOutA(hdc, vertices[i].x, vertices[i].y, txt, strlen(txt));
  282. }
  283. }
  284.  
  285. {
  286. HBRUSH red = ::CreateSolidBrush(RGB(255, 0, 0));
  287. HGDIOBJ brush = ::SelectObject(hdc, red);
  288. HGDIOBJ pen = ::SelectObject(hdc, ::GetStockObject(NULL_PEN));
  289. for (auto& v : vertices) {
  290. ::Rectangle(hdc, v.x - 2, v.y - 2, v.x + 2, v.y + 2);
  291. }
  292. ::SelectObject(hdc, pen);
  293. ::SelectObject(hdc, brush);
  294. ::DeleteObject(red);
  295. }
  296. {
  297. auto i = std::begin(vertices);
  298. auto e = std::end(vertices);
  299. ::MoveToEx(hdc, i->x, i->y, nullptr);
  300. while (i != e) {
  301. auto to = std::next(i);
  302. if (to == e)
  303. to = std::begin(vertices);
  304. ::LineTo(hdc, to->x, to->y);
  305. i++;
  306. }
  307. }
  308. }
  309. }
  310.  
  311. EndPaint(hWnd, &ps);
  312. }
  313. break;
  314. case WM_DESTROY:
  315. PostQuitMessage(0);
  316. break;
  317. default:
  318. return DefWindowProc(hWnd, message, wParam, lParam);
  319. }
  320. return 0;
  321. }
  322.  
  323.  
Compilation error #stdin compilation error #stdout 0s 0KB
stdin
Standard input is empty
compilation info
prog.cpp:6:21: fatal error: windows.h: No such file or directory
 #include <windows.h>
                     ^
compilation terminated.
stdout
Standard output is empty