commit 8ef7458c9a9a8640230ba3fa18630b978613e394
parent 69c983182a7d761d55e3436e50346f7b2d12d374
Author: Matsuda Kenji <info@mtkn.jp>
Date: Tue, 3 Jan 2023 08:44:48 +0900
add xlib_playground5
Diffstat:
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>