www.mtkn.jp

Manuscripts for my personal webpage.
git clone https://git.mtkn.jp/www.mtkn.jp
Log | Files | Refs | README

commit 8ef7458c9a9a8640230ba3fa18630b978613e394
parent 69c983182a7d761d55e3436e50346f7b2d12d374
Author: Matsuda Kenji <info@mtkn.jp>
Date:   Tue,  3 Jan 2023 08:44:48 +0900

add xlib_playground5

Diffstat:
Mdata/weblog | 4++++
Mman/computer/index.html | 1+
Aman/computer/videos/ex5.webm | 0
Mman/computer/xlib_playground4.html | 4++++
Aman/computer/xlib_playground5.html | 112+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Mman/index.html | 1+
Mpub/computer/index.html | 1+
Apub/computer/videos/ex5.webm | 0
Mpub/computer/xlib_playground4.html | 3+++
Apub/computer/xlib_playground5.html | 138+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Mpub/index.html | 1+
Mpub/rss.xml | 123+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++--
Mpub/sitemap.xml | 5+++--
13 files changed, 388 insertions(+), 5 deletions(-)

diff --git a/data/weblog b/data/weblog @@ -117,3 +117,7 @@ 1672585200 /computer/xlib_playground4.html 1672585200 /index.html 1672585200 /computer/xlib_playground3.html +1672671600 /computer/xlib_playground5.html +1672671600 /computer/index.html +1672671600 /computer/xlib_playground4.html +1672671600 /index.html diff --git a/man/computer/index.html b/man/computer/index.html @@ -8,6 +8,7 @@ Small is beautiful. <li><a href="xlib_playground2.html">Xlibで遊んでみる2</a></li> <li><a href="xlib_playground3.html">Xlibで遊んでみる3</a></li> <li><a href="xlib_playground4.html">Xlibで遊んでみる4</a></li> + <li><a href="xlib_playground5.html">Xlibで遊んでみる5</a></li> </ul> <h2>MISC</h1> diff --git a/man/computer/videos/ex5.webm b/man/computer/videos/ex5.webm Binary files differ. diff --git a/man/computer/xlib_playground4.html b/man/computer/xlib_playground4.html @@ -157,3 +157,7 @@ game_play(void) <ul> <li><a href="https://tronche.com/gui/x/xlib/">The Xlib Manual(html conversion)</a></li> </ul> +<p> +次の記事: \ +<a href="xlib_playground5.html">Xlibで遊んでみる5</a> +</p> diff --git a/man/computer/xlib_playground5.html b/man/computer/xlib_playground5.html @@ -0,0 +1,112 @@ +<h1>Xlibで遊んでみる5</h1> +<time>2023-01-03</time> + +<p> +前回: <a href="xlib_playground4.html">Xlibで遊んでみる4</a> +</p> +<p> +言語: C言語<br /> +ソースコード: \ +<a href="https://git.mtkn.jp/xlib_playground/log.html">git</a> +</p> + +<h2>円の衝突判定とその処理</h2> +<p> +前回四角形で行っていた衝突判定とその処理を今回は円でした。\ +衝突の判定は二つの円の中心間の距離と、各円の半径の和を比較するだけなので\ +簡単である: +</p> +<pre><code>\ +struct circle { + float ppx, ppy; // previous position (center) + float px, py; // current position (center) + float vx, vy; // velocity + int r; // radius + int m; // mass +}; + +int +circle_test_collision(struct circle *c1, struct circle *c2) +{ + return (c1->px - c2->px) * (c1->px - c2->px) + + (c1->py - c2->py) * (c1->py - c2->py) < + (c1->r + c2->r) * (c1->r + c2->r); +} +</code></pre> + +<p> +衝突後は前回と同じく弾性衝突として処理した。\ +四角形とは違い、衝突方向の場合分けが不要なので楽である。 +</p> +<pre><code> +void +circle_handle_collision_mm(struct circle *c1, struct circle *c2) +{ + if (!circle_test_collision(c1, c2)) + return; + + float col_px = c2->px - c1->px; + float col_py = c2->py - c1->py; + float col_pr = sqrtf(col_px * col_px + col_py * col_py); + col_px /= col_pr; + col_py /= col_pr; + + c1->px = c1->px - col_px / 2; + c1->py = c1->py - col_py / 2; + c2->px = c2->px + col_px / 2; + c2->py = c2->py + col_py / 2; +} + +void +circle_handle_collision_elastic(struct circle *c1, struct circle *c2) +{ + if(!circle_test_collision(c1, c2)) + return; + + float col_px = c2->px - c1->px; + float col_py = c2->py - c1->py; + float col_pr = sqrtf(col_px * col_px + col_py * col_py); + col_px /= col_pr; + col_py /= col_pr; + float nor_px = col_py; + float nor_py = -col_px; + + float m1 = c1->m; + float m2 = c2->m; + + float col_1v = c1->vx * col_px + c1->vy * col_py; + float col_2v = c2->vx * col_px + c2->vy * col_py; + + float col_1vxn = (2*m2/(m1+m2)*col_2v + (m1-m2)/(m1+m2)*col_1v) * col_px; + float col_1vyn = (2*m2/(m1+m2)*col_2v + (m1-m2)/(m1+m2)*col_1v) * col_py; + float col_2vxn = (2*m1/(m1+m2)*col_1v + (m2-m1)/(m1+m2)*col_2v) * col_px; + float col_2vyn = (2*m1/(m1+m2)*col_1v + (m2-m1)/(m1+m2)*col_2v) * col_py; + + float nor_1vx = nor_px * (c1->vx * nor_px + c1->vy * nor_py); + float nor_1vy = nor_py * (c1->vx * nor_px + c1->vy * nor_py); + float nor_2vx = nor_px * (c2->vx * nor_px + c2->vy * nor_py); + float nor_2vy = nor_py * (c2->vx * nor_px + c2->vy * nor_py); + + c1->vx = col_1vxn + nor_1vx; + c1->vy = col_1vyn + nor_1vy; + c2->vx = col_2vxn + nor_2vx; + c2->vy = col_2vyn + nor_2vy; + + circle_handle_collision_mm(c1, c2); +} +</code></pre> + +<h2>完成品</h2> +<p> +<a href="https://git.mtkn.jp/xlib_playground/file/ex5/ex5.c.html">git</a> +</p> +<p> +<video controls> +<source src="videos/ex5.webm" type="video/webm"> +</video> +</p> + +<h2>参考</h2> +<ul> +<li><a href="https://tronche.com/gui/x/xlib/">The Xlib Manual(html conversion)</a></li> +</ul> diff --git a/man/index.html b/man/index.html @@ -9,6 +9,7 @@ <h2>更新履歴</h2> <a href="/rss.xml">RSS</a> <ul> +<li>2023-01-03 <a href="/computer/xlib_playground5.html">Xlibで遊んでみる5</a></li> <li>2023-01-02 <a href="/computer/xlib_playground4.html">Xlibで遊んでみる4</a></li> <li>2023-01-02 <a href="/computer/xlib_playground3.html">Xlibで遊んでみる3</a></li> <li>2022-12-28 <a href="/journal/posts/20221228.html">Holy Shit!</a></li> diff --git a/pub/computer/index.html b/pub/computer/index.html @@ -31,6 +31,7 @@ Small is beautiful. <li><a href="xlib_playground2.html">Xlibで遊んでみる2</a></li> <li><a href="xlib_playground3.html">Xlibで遊んでみる3</a></li> <li><a href="xlib_playground4.html">Xlibで遊んでみる4</a></li> + <li><a href="xlib_playground5.html">Xlibで遊んでみる5</a></li> </ul> <h2>MISC</h1> diff --git a/pub/computer/videos/ex5.webm b/pub/computer/videos/ex5.webm Binary files differ. diff --git a/pub/computer/xlib_playground4.html b/pub/computer/xlib_playground4.html @@ -161,6 +161,9 @@ game_play(void) <ul> <li><a href="https://tronche.com/gui/x/xlib/">The Xlib Manual(html conversion)</a></li> </ul> +<p> +次の記事: <a href="xlib_playground5.html">Xlibで遊んでみる5</a> +</p> </article> </main> diff --git a/pub/computer/xlib_playground5.html b/pub/computer/xlib_playground5.html @@ -0,0 +1,138 @@ +<!DOCTYPE html> +<html lang="ja"> +<head> + <meta charset="utf-8" /> + <meta name="viewport" content="width=device-width,initial-scale=1" /> + <link rel="stylesheet" type="text/css" href="/style.css" /> + <link rel="icon" type="image/x-icon" href="/pics/favicon.ico" /> + <title>Xlibで遊んでみる5</title> +</head> +<body> + <header> + <a href="/">主頁</a> | + <a href="/about.html">自己紹介</a> | + <a href="/journal">日記</a> | + <a href="/farm">農業</a> | + <a href="/kitchen">台所</a> | + <a href="/computer">コンピュータ</a> | + <a href="/poetry">詩</a> | + <a href="/books">本棚</a> | + <a href="https://git.mtkn.jp">Git</a> + </header> + <main> + <article> +<h1>Xlibで遊んでみる5</h1> +<time>2023-01-03</time> + +<p> +前回: <a href="xlib_playground4.html">Xlibで遊んでみる4</a> +</p> +<p> +言語: C言語<br /> +ソースコード: <a href="https://git.mtkn.jp/xlib_playground/log.html">git</a> +</p> + +<h2>円の衝突判定とその処理</h2> +<p> +前回四角形で行っていた衝突判定とその処理を今回は円でした。衝突の判定は二つの円の中心間の距離と、各円の半径の和を比較するだけなので簡単である: +</p> +<pre><code>struct circle { + float ppx, ppy; // previous position (center) + float px, py; // current position (center) + float vx, vy; // velocity + int r; // radius + int m; // mass +}; + +int +circle_test_collision(struct circle *c1, struct circle *c2) +{ + return (c1->px - c2->px) * (c1->px - c2->px) + + (c1->py - c2->py) * (c1->py - c2->py) < + (c1->r + c2->r) * (c1->r + c2->r); +} +</code></pre> + +<p> +衝突後は前回と同じく弾性衝突として処理した。四角形とは違い、衝突方向の場合分けが不要なので楽である。 +</p> +<pre><code> +void +circle_handle_collision_mm(struct circle *c1, struct circle *c2) +{ + if (!circle_test_collision(c1, c2)) + return; + + float col_px = c2->px - c1->px; + float col_py = c2->py - c1->py; + float col_pr = sqrtf(col_px * col_px + col_py * col_py); + col_px /= col_pr; + col_py /= col_pr; + + c1->px = c1->px - col_px / 2; + c1->py = c1->py - col_py / 2; + c2->px = c2->px + col_px / 2; + c2->py = c2->py + col_py / 2; +} + +void +circle_handle_collision_elastic(struct circle *c1, struct circle *c2) +{ + if(!circle_test_collision(c1, c2)) + return; + + float col_px = c2->px - c1->px; + float col_py = c2->py - c1->py; + float col_pr = sqrtf(col_px * col_px + col_py * col_py); + col_px /= col_pr; + col_py /= col_pr; + float nor_px = col_py; + float nor_py = -col_px; + + float m1 = c1->m; + float m2 = c2->m; + + float col_1v = c1->vx * col_px + c1->vy * col_py; + float col_2v = c2->vx * col_px + c2->vy * col_py; + + float col_1vxn = (2*m2/(m1+m2)*col_2v + (m1-m2)/(m1+m2)*col_1v) * col_px; + float col_1vyn = (2*m2/(m1+m2)*col_2v + (m1-m2)/(m1+m2)*col_1v) * col_py; + float col_2vxn = (2*m1/(m1+m2)*col_1v + (m2-m1)/(m1+m2)*col_2v) * col_px; + float col_2vyn = (2*m1/(m1+m2)*col_1v + (m2-m1)/(m1+m2)*col_2v) * col_py; + + float nor_1vx = nor_px * (c1->vx * nor_px + c1->vy * nor_py); + float nor_1vy = nor_py * (c1->vx * nor_px + c1->vy * nor_py); + float nor_2vx = nor_px * (c2->vx * nor_px + c2->vy * nor_py); + float nor_2vy = nor_py * (c2->vx * nor_px + c2->vy * nor_py); + + c1->vx = col_1vxn + nor_1vx; + c1->vy = col_1vyn + nor_1vy; + c2->vx = col_2vxn + nor_2vx; + c2->vy = col_2vyn + nor_2vy; + + circle_handle_collision_mm(c1, c2); +} +</code></pre> + +<h2>完成品</h2> +<p> +<a href="https://git.mtkn.jp/xlib_playground/file/ex5/ex5.c.html">git</a> +</p> +<p> +<video controls> +<source src="videos/ex5.webm" type="video/webm"> +</video> +</p> + +<h2>参考</h2> +<ul> +<li><a href="https://tronche.com/gui/x/xlib/">The Xlib Manual(html conversion)</a></li> +</ul> + </article> + + </main> + <footer> + <address>info(at)mtkn(dot)jp</address> + </footer> +</body> +</html> diff --git a/pub/index.html b/pub/index.html @@ -32,6 +32,7 @@ <h2>更新履歴</h2> <a href="/rss.xml">RSS</a> <ul> +<li>2023-01-03 <a href="/computer/xlib_playground5.html">Xlibで遊んでみる5</a></li> <li>2023-01-02 <a href="/computer/xlib_playground4.html">Xlibで遊んでみる4</a></li> <li>2023-01-02 <a href="/computer/xlib_playground3.html">Xlibで遊んでみる3</a></li> <li>2022-12-28 <a href="/journal/posts/20221228.html">Holy Shit!</a></li> diff --git a/pub/rss.xml b/pub/rss.xml @@ -5,14 +5,128 @@ <description>ウェブページの更新履歴</description> <language>ja-jp</language> <link>https://www.mtkn.jp</link> -<lastBuildDate>Tue, 3 Jan 2023 07:59:15 +0900</lastBuildDate> -<pubDate>Tue, 3 Jan 2023 07:59:15 +0900</pubDate> +<lastBuildDate>Tue, 3 Jan 2023 08:43:20 +0900</lastBuildDate> +<pubDate>Tue, 3 Jan 2023 08:43:20 +0900</pubDate> <docs>https://www.rssboard.org/rss-specification</docs> <item> +<title>Xlibで遊んでみる5</title> +<link>https://www.mtkn.jp/computer/xlib_playground5.html</link> +<guid>https://www.mtkn.jp/computer/xlib_playground5.html</guid> +<pubDate>Tue, 3 Jan 2023 00:00:00 +0900</pubDate> +<description><![CDATA[<h1>Xlibで遊んでみる5</h1> +<time>2023-01-03</time> + +<p> +前回: <a href="xlib_playground4.html">Xlibで遊んでみる4</a> +</p> +<p> +言語: C言語<br /> +ソースコード: <a href="https://git.mtkn.jp/xlib_playground/log.html">git</a> +</p> + +<h2>円の衝突判定とその処理</h2> +<p> +前回四角形で行っていた衝突判定とその処理を今回は円でした。衝突の判定は二つの円の中心間の距離と、各円の半径の和を比較するだけなので簡単である: +</p> +<pre><code>struct circle { + float ppx, ppy; // previous position (center) + float px, py; // current position (center) + float vx, vy; // velocity + int r; // radius + int m; // mass +}; + +int +circle_test_collision(struct circle *c1, struct circle *c2) +{ + return (c1->px - c2->px) * (c1->px - c2->px) + + (c1->py - c2->py) * (c1->py - c2->py) < + (c1->r + c2->r) * (c1->r + c2->r); +} +</code></pre> + +<p> +衝突後は前回と同じく弾性衝突として処理した。四角形とは違い、衝突方向の場合分けが不要なので楽である。 +</p> +<pre><code> +void +circle_handle_collision_mm(struct circle *c1, struct circle *c2) +{ + if (!circle_test_collision(c1, c2)) + return; + + float col_px = c2->px - c1->px; + float col_py = c2->py - c1->py; + float col_pr = sqrtf(col_px * col_px + col_py * col_py); + col_px /= col_pr; + col_py /= col_pr; + + c1->px = c1->px - col_px / 2; + c1->py = c1->py - col_py / 2; + c2->px = c2->px + col_px / 2; + c2->py = c2->py + col_py / 2; +} + +void +circle_handle_collision_elastic(struct circle *c1, struct circle *c2) +{ + if(!circle_test_collision(c1, c2)) + return; + + float col_px = c2->px - c1->px; + float col_py = c2->py - c1->py; + float col_pr = sqrtf(col_px * col_px + col_py * col_py); + col_px /= col_pr; + col_py /= col_pr; + float nor_px = col_py; + float nor_py = -col_px; + + float m1 = c1->m; + float m2 = c2->m; + + float col_1v = c1->vx * col_px + c1->vy * col_py; + float col_2v = c2->vx * col_px + c2->vy * col_py; + + float col_1vxn = (2*m2/(m1+m2)*col_2v + (m1-m2)/(m1+m2)*col_1v) * col_px; + float col_1vyn = (2*m2/(m1+m2)*col_2v + (m1-m2)/(m1+m2)*col_1v) * col_py; + float col_2vxn = (2*m1/(m1+m2)*col_1v + (m2-m1)/(m1+m2)*col_2v) * col_px; + float col_2vyn = (2*m1/(m1+m2)*col_1v + (m2-m1)/(m1+m2)*col_2v) * col_py; + + float nor_1vx = nor_px * (c1->vx * nor_px + c1->vy * nor_py); + float nor_1vy = nor_py * (c1->vx * nor_px + c1->vy * nor_py); + float nor_2vx = nor_px * (c2->vx * nor_px + c2->vy * nor_py); + float nor_2vy = nor_py * (c2->vx * nor_px + c2->vy * nor_py); + + c1->vx = col_1vxn + nor_1vx; + c1->vy = col_1vyn + nor_1vy; + c2->vx = col_2vxn + nor_2vx; + c2->vy = col_2vyn + nor_2vy; + + circle_handle_collision_mm(c1, c2); +} +</code></pre> + +<h2>完成品</h2> +<p> +<a href="https://git.mtkn.jp/xlib_playground/file/ex5/ex5.c.html">git</a> +</p> +<p> +<video controls> +<source src="videos/ex5.webm" type="video/webm"> +</video> +</p> + +<h2>参考</h2> +<ul> +<li><a href="https://tronche.com/gui/x/xlib/">The Xlib Manual(html conversion)</a></li> +</ul> +]]></description> +</item> +<item> <title>Xlibで遊んでみる4</title> <link>https://www.mtkn.jp/computer/xlib_playground4.html</link> <guid>https://www.mtkn.jp/computer/xlib_playground4.html</guid> -<pubDate>Mon, 2 Jan 2023 00:00:00 +0900</pubDate> +<pubDate>Tue, 3 Jan 2023 00:00:00 +0900</pubDate> <description><![CDATA[<h1>Xlibで遊んでみる4</h1> <time>2023-01-02</time> @@ -153,6 +267,9 @@ game_play(void) <ul> <li><a href="https://tronche.com/gui/x/xlib/">The Xlib Manual(html conversion)</a></li> </ul> +<p> +次の記事: <a href="xlib_playground5.html">Xlibで遊んでみる5</a> +</p> ]]></description> </item> <item> diff --git a/pub/sitemap.xml b/pub/sitemap.xml @@ -1,10 +1,11 @@ <?xml version="1.0" encoding="UTF-8"?> <urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9"> <url><loc>https://www.mtkn.jp/</loc><lastmod>2023-12-28</lastmod></url> -<url><loc>https://www.mtkn.jp/computer/xlib_playground4.html</loc><lastmod>2023-01-02</lastmod></url> +<url><loc>https://www.mtkn.jp/computer/xlib_playground5.html</loc><lastmod>2023-01-03</lastmod></url> +<url><loc>https://www.mtkn.jp/computer/xlib_playground4.html</loc><lastmod>2023-01-03</lastmod></url> +<url><loc>https://www.mtkn.jp/computer/</loc><lastmod>2023-01-03</lastmod></url> <url><loc>https://www.mtkn.jp/computer/xlib_playground3.html</loc><lastmod>2023-01-02</lastmod></url> <url><loc>https://www.mtkn.jp/computer/xlib_playground2.html</loc><lastmod>2023-01-02</lastmod></url> -<url><loc>https://www.mtkn.jp/computer/</loc><lastmod>2023-01-02</lastmod></url> <url><loc>https://www.mtkn.jp/journal/posts/20221228.html</loc><lastmod>2022-12-28</lastmod></url> <url><loc>https://www.mtkn.jp/journal/</loc><lastmod>2022-12-28</lastmod></url> <url><loc>https://www.mtkn.jp/computer/xlib_playground1.html</loc><lastmod>2022-12-22</lastmod></url>