<?xml version="1.0" encoding="UTF-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
  <title>Iterative Tangents</title>
  <link href="https://blog.exupero.org/atom.xml" rel="self"/>
  <link href="https://blog.exupero.org/"/>
  <updated>2026-03-10T12:28:20+00:00</updated>
  <id>https://blog.exupero.org/</id>
  <author>
    <name>exupero</name>
  </author>
  <entry>
    <id>https://blog.exupero.org/diff-files-for-troubleshooting-git-branches</id>
    <link href="https://blog.exupero.org/diff-files-for-troubleshooting-git-branches"/>
    <title>Diff files for troubleshooting Git branches</title>
    <updated>2026-03-10T08:00:00+00:00</updated>
    <content type="html"><![CDATA[<p>A couple months ago I wrote about using <a href='/local-pr-review'>diff files to review code</a> in Neovim, instead of using GitHub's UI. That's a recent innovation, but I've long used diffs to troubleshoot problems in unfamiliar code, to isolate the cause of a bug or test failure when neither inspection of the code nor step-by-step debugging has uncovered it. When commits are granular and atomic, I can use <code>git bisect</code> to isolate the problem, but that's not always an option. Sometimes the branch has messy commits; maybe mine, maybe someone else's. So when bisecting doesn't work, I've applied partial reverse diff files to find what causes a problem.</p><p>For a long time I would revert the whole branch without committing, then stage reverted chunks one at a time, clear the unstaged changes, and check for the bug or test failure. That worked alright, but it could often get confusing. It can be a little tricky to think in terms of staging reversions, and if the set of changes didn't fix the problem, or introduced a new problem, such as by not undoing some related changes, then I had to reset my git index and start over. Now I stage changes via diff files, instead of using Git's staging area. Here's how.</p><p>I start on a branch off the main development branch (<code>main</code>), then clear the working directory of uncommitted changes, either by committing them, stashing them, or discarding them. Then I create a reverse diff and save it to a file with <code>git diff main... -R &gt; changes.diff</code>. That diff captures the changes that will undo the entire branch and make it identical to <code>main</code>. Since I only want to undo specific changes, I open a new file, say, <code>candidate.diff</code>, and copy sections of <code>changes.diff</code> over to it one at a time. Diff files are arranged as chunks within files, so it's easiest to copy across the full file then delete any unwanted chunks. Once I have the changes I want undone in <code>candidate.diff</code>, I apply it with <code>cat candidate.diff | patch -p1</code>, then check for the bug or test failure. If the problem isn't fixed, or if some additional reversions are needed, I try again by clearing changes with <code>git checkout -- .</code>, then I edit <code>candidate.diff</code>, run the new patch, and test again.</p><p>I've been using much smaller, more atomic commits lately, so <code>git bisect</code> works well, and it's been a while since I needed this workflow. Next time I do need it, though, I plan to write some helper scripts. For example, here's a small script to alleviate the confusion of patching reversions by first reverting the whole branch, then applying the positive diff:</p><pre><code class="bash">#!/bin/bash

patch=$1

git diff main... -R | patch -p1
cat $patch | patch -p1
</code></pre><p>If you have other tips for troubleshooting changes on a Git branch, <a href="mailto:blog@exupero.org?subject=Diff files for troubleshooting Git branches">email me</a>.</p>
]]></content>
  </entry>
  <entry>
    <id>https://blog.exupero.org/local-pr-review</id>
    <link href="https://blog.exupero.org/local-pr-review"/>
    <title>Local PR review</title>
    <updated>2026-01-13T08:00:00+00:00</updated>
    <content type="html"><![CDATA[<p>At work I've been reviewing some large pull requests, ranging from thousands of lines of new code to tens of thousands, and in the process I've discovered how limiting GitHub's web interface for code review is, both the default UI and the beta UI. To handle these reviews, I started reviewing PRs on my local machine. Here's what my workflow looks like, with lots of links to NeoVim code and small scripts for manipulating diffs.</p><p>I briefly considered building my own web UI. I <a href='https://github.com/exupero/review'>did that</a> a few years ago when working on a team that hosted their code on BitBucket after I'd gotten used to GitHub reviews and treating review comments as notes to myself, coming back to delete questions answered by later code or clarifing thoughts before publishing anything. But before diving into a frontend application, I took a lesson from <a href='/drafting-pull-requests'>drafting pull requests locally</a> and decided to see how far I could get with a diff, NeoVim, and some scripts.</p><p>A big advantage of reviewing code in a local text editor is that it can handle large diffs without requiring me to click "Load diff" on particular files or only showing one file at a time, which allows searching the whole set of changes for particular patterns, such as <code>TODO</code> comments or the catching of too broad exceptions. I can also <a href='https://github.com/exupero/scripts/blob/main/diff-filter'>exclude files in bulk</a>, like generated code, documentation, and tests, depending on what my focus is for a given review. It's also a lot easier to review changes made since the last review, just by creating a diff with <code>git diff &lt;last-reviewed-commit&gt;...HEAD</code>.</p><p>But it's not a perfect experience, and I did a lot of customization to NeoVim to make it more diff-friendly. For starters, GitHub allows collapsing files. To support collapsing both files and chunks within a file, I defined a fold method and expression:</p><pre><code class="vimscript">setlocal foldmethod=expr
setlocal foldexpr=v:lua.diff&#95;fold&#95;level&#40;&#41;
setlocal foldtext=v:lua.diff&#95;fold&#95;text&#40;&#41;
setlocal foldlevel=99
</code></pre><p>The Lua functions are implemented in <a href='https://fennel-lang.org/'>Fennel</a>:</p><pre><code class="fennel">&#40;fn file-start? &#91;line&#93;
 &#40;string.match line &quot;&#94;diff&quot;&#41;

&#40;fn chunk-start? &#91;line&#93;
  &#40;string.match line &quot;&#94;@@&quot;&#41;&#41;

&#40;fn &#95;G.diff&#95;fold&#95;level &#91;line&#93;
  &#40;let &#91;line &#40;vim.fn.getline &#40;or line vim.v.lnum&#41;&#41;&#93;
    &#40;if
      &#40;file-start? line&#41; :&gt;1
      &#40;chunk-start? line&#41; :&gt;2
      :=&#41;&#41;&#41;

&#40;fn &#95;G.diff&#95;fold&#95;text &#91;&#93;
  &#40;let &#91;line &#40;vim.fn.getline vim.v.foldstart&#41;
        count &#40;+ 1 &#40;- vim.v.foldend vim.v.foldstart&#41;&#41;
        level &#40;&#95;G.diff&#95;fold&#95;level vim.v.foldstart&#41;
        prefix &#40;case level
                 &#40;where :&gt;1&#41; &quot;&quot;
                 &#40;where :&gt;2&#41; &quot;▶ &quot;
                 &#95;  &quot;&quot;&#41;&#93;
    &#40;.. prefix line &quot; &#40;&quot; count &quot; lines&#41;&quot;&#41;&#41;&#41;
</code></pre><p>It's often helpful to jump from the diff to a particular file, to see the full context of the current code, so <a href='https://github.com/exupero/vim/blob/main/fnl/diff.fnl#L41-L51'>here</a>'s a command that uses the cursor's current position to find the right file name and chunk header, then calculate where to go and open it in a new tab.</p><p>Some chunks are not interesting and can be <a href='https://github.com/exupero/vim/blob/main/fnl/diff.fnl#L86-L98'>deleted</a> from the diff, or <a href='https://github.com/exupero/vim/blob/main/fnl/diff.fnl#L126-L133'>whole files</a>. Sometimes part of a chunk can be deleted but not others, so I also have a <a href='https://github.com/exupero/vim/blob/main/fnl/diff.fnl#L86-L98'>command</a> to delete from the top of the chunk down to the cursor, which also updates the chunk header so jumping to the chunk's position in the file still works.</p><p>Often I start a review with the smallest changes, so <a href='https://github.com/exupero/scripts/blob/main/diff-sort'>here</a>'s a <a href='https://babashka.org/'>Babashka</a> script that sorts the files in a diff by how many lines each file has. Using it for a while, I've added the ability to sort by how many additions each file has, or deletions, or how close the ratio of additions to deletions is, or whether the file name contains the word "test". And <a href='https://github.com/exupero/scripts/blob/main/diff-rotate'>here</a>'s a script that moves the first file to the end of the diff, for cases where I don't want to delete the file but also don't want to review it yet.</p><p>Beyond shuffling code, I also needed to add comments. I opted to use markers in the first column of the dif, adding <code>v</code> and <code>&#94;</code> to indicate what range of lines I'm commenting on, and <code>x</code> to indicate the end of a comment, like this:</p><pre><code class="diff">diff --git a/old&#95;file.txt b/new&#95;file.txt
index 2a2e9f1..a48d7f5 100644
--- a/old&#95;file.txt
+++ b/new&#95;file.txt
@@ -1,1 +1,2 @@
-Notes on changes
+An ode
v
+To my code
&#94;
👏
x
</code></pre><p>I add those markers with a couple of <a href='https://github.com/exupero/vim/blob/6d95f503f12889e1358107bdbd34039160e287a6/fnl/diff.fnl#L152-L172'>NeoVim commands</a> that also put the highlighted lines into the copy register, which allows using them in an UltiSnips expansion, such as for <a href='https://github.com/exupero/snippets/blob/main/diff/markdown.snippets'>making a suggestion</a>. It's also trivial to adjust the range of lines being commented on by moving the markers, while to adjust the range of a comment on GitHub I have to copy a comment's content, delete the comment, select a new range, create a new comment, and paste the original comment.</p><p>I have a <a href='https://github.com/exupero/scripts/blob/main/diff-comments'>script</a> to collect those comments as Markdown, with file and line metadata in the header of the fenced code block:</p><pre><code>```diff new&#95;file.txt -2 +2
+To my code
```

👏</code></pre><p>Comments are separated by <code>---</code>.</p><p>I write those comments to a file, tweak them if necessary, and create a pending GitHub review with <a href='https://github.com/exupero/scripts/blob/main/lib/markdown/review.clj'>this code</a>. I keep that file of comments as a place to track what comments have been addressed and how, whether a requested change was made (and in what commit) or an answer was given for a question.</p><p>One final advantage of using NeoVim is how easy it is to define key bindings for all these actions, especially repeated actions using <a href='https://github.com/tpope/vim-repeat'>vim-repeat</a>, making code review very fluid.</p><p>There are, however, some pitfalls. One is that it's easy to delete chunks that have comments. To avoid losing work, I added NeoVim functions that write any deleted or truncated code that have comments into a separate file, which I later use to create the Markdown comments. Another problem is that I don't see anyone else's comments while reviewing, so I occasionally make duplicate comments or miss explanations that aren't in the code. The most annoying pitfall, though, is not having the latest revision locally, causingy my comments to end up on the wrong lines of the current revision. That's part of the reason the script which creates the review only creates a pending review, so I can check it before submitting (though finding pending comments in GitHub's review UI is still a challenge).</p><p>I volunteered to review these large PRs because I'm always curious where my personal workflow hits a breaking point, and finding the friction gives me an opportunity to improve my tools in ways that benefit small tasks too. If you have further suggestions, or ideas on how to mitigate the pitfalls, <a href="mailto:blog@exupero.org?subject=Local PR review">email me</a>!</p>
]]></content>
  </entry>
  <entry>
    <id>https://blog.exupero.org/distance-shapes-playground</id>
    <link href="https://blog.exupero.org/distance-shapes-playground"/>
    <title>Distance shapes playground</title>
    <updated>2025-09-22T08:00:00+00:00</updated>
    <content type="html"><![CDATA[<p>The <a href='/circles-of-apollonius'>previous</a> <a href='/point-line-sum-shapes'>four</a> <a href='/point-line-difference-shapes'>posts</a> <a href='/point-line-product-shapes'>about</a> distance shapes in Euclidean and taxicab geometries included illustrations that differed from the ones in my earlier posts about taxicab geometry. In those posts, I hard-coded points and lines in SVGs. Basic shapes like circles, ellipses, and parabolas are fairly easy to work out by hand. To draw <a href='/ovals-of-cassini-in-taxicab-geometry/'>ovals of Cassini</a> I used an algebraic approach, but it was limited to cases where the foci were aligned vertically with each other. For more complex shapes, and cover all possible variations of those shapes, I made a distance shape playground. You can find the latest version of it <a href='https://distance-shapes.exupero.org'>here</a>.</p><p>The buttons on the right add shapes to the both grids, the upper grid showing the shape in Euclidean geometry, while the lower uses the Manhattan distance to draw the shape in taxicab geometry. The same control points are used for both plots. Drag points to change the shapes. To reset the plots, click the "Clear" button. To export a plot as an SVG, click "Export SVG" on the upper right of each plot.</p><p>The current implementation defines each shape as a two-dimensional signed distance function, where negative values denote the inside of a shape, positive values the outside, and zero values the boundary. To draw the boundary, it uses a simple <a href='https://en.wikipedia.org/wiki/Marching_squares'>marching squares</a> algorithm. It's not particularly fast, especially not at the level of recursion needed for a smooth curve. Thus, when dragging points, you'll see the recursion level drop and shapes become less precise, which helps keep the visual responsive, though it's by no means as fast as one would hope.</p><p>Nor is the algorithm flawless. The boundary will occasionally spill into a square whose corners are all outside the shape, so the boundary inside that square is missing. It also misses cases where the boundary itself becomes two-dimensional, as it can for midsets and difference-based hyperbolas. But speed wasn't necessary for the few static illustrations I needed, and unhandled edge cases were easy to avoid.</p><p>I played with partial support for additional <a href='https://en.wikipedia.org/wiki/Minkowski_distance'>Minkowski distances</a>, but while the shapes were interesting, their meaning was much harder to intuit, and broken edge cases were more common.</p><p>The original prototype, with all the same functionality, was about 500 lines of ClojureScript code. The public playground is slightly shorter, thanks to offloading some functions I commonly use to a <a href='https://github.com/exupero/polymath'>library</a>.</p><p>If you have suggestions for improvements, <a href="mailto:blog@exupero.org?subject=Distance shapes playground">I'm happy to hear them</a>.</p>
]]></content>
  </entry>
  <entry>
    <id>https://blog.exupero.org/point-line-product-shapes</id>
    <link href="https://blog.exupero.org/point-line-product-shapes"/>
    <title>Point-line product shapes</title>
    <updated>2025-09-18T08:00:00+00:00</updated>
    <content type="html"><![CDATA[<p>The last of these unnamed shape definitions is the one that's a constant product of distances to a focus and a directrix:</p>
<div class="formula"><svg xmlns:xlink="http://www.w3.org/1999/xlink" width="24.453ex" height="2.843ex" style="vertical-align: -0.838ex;" viewBox="0 -863.1 10528.2 1223.9" role="img" focusable="false" xmlns="http://www.w3.org/2000/svg" aria-labelledby="MathJax-SVG-1-Title">
<title id="MathJax-SVG-1-Title">d i s t left-parenthesis p comma f right-parenthesis dot d i s t left-parenthesis p comma l right-parenthesis equals c</title>
<defs aria-hidden="true">
<path stroke-width="1" id="E1-MJMATHI-64" d="M366 683Q367 683 438 688T511 694Q523 694 523 686Q523 679 450 384T375 83T374 68Q374 26 402 26Q411 27 422 35Q443 55 463 131Q469 151 473 152Q475 153 483 153H487H491Q506 153 506 145Q506 140 503 129Q490 79 473 48T445 8T417 -8Q409 -10 393 -10Q359 -10 336 5T306 36L300 51Q299 52 296 50Q294 48 292 46Q233 -10 172 -10Q117 -10 75 30T33 157Q33 205 53 255T101 341Q148 398 195 420T280 442Q336 442 364 400Q369 394 369 396Q370 400 396 505T424 616Q424 629 417 632T378 637H357Q351 643 351 645T353 664Q358 683 366 683ZM352 326Q329 405 277 405Q242 405 210 374T160 293Q131 214 119 129Q119 126 119 118T118 106Q118 61 136 44T179 26Q233 26 290 98L298 109L352 326Z"></path>
<path stroke-width="1" id="E1-MJMATHI-69" d="M184 600Q184 624 203 642T247 661Q265 661 277 649T290 619Q290 596 270 577T226 557Q211 557 198 567T184 600ZM21 287Q21 295 30 318T54 369T98 420T158 442Q197 442 223 419T250 357Q250 340 236 301T196 196T154 83Q149 61 149 51Q149 26 166 26Q175 26 185 29T208 43T235 78T260 137Q263 149 265 151T282 153Q302 153 302 143Q302 135 293 112T268 61T223 11T161 -11Q129 -11 102 10T74 74Q74 91 79 106T122 220Q160 321 166 341T173 380Q173 404 156 404H154Q124 404 99 371T61 287Q60 286 59 284T58 281T56 279T53 278T49 278T41 278H27Q21 284 21 287Z"></path>
<path stroke-width="1" id="E1-MJMATHI-73" d="M131 289Q131 321 147 354T203 415T300 442Q362 442 390 415T419 355Q419 323 402 308T364 292Q351 292 340 300T328 326Q328 342 337 354T354 372T367 378Q368 378 368 379Q368 382 361 388T336 399T297 405Q249 405 227 379T204 326Q204 301 223 291T278 274T330 259Q396 230 396 163Q396 135 385 107T352 51T289 7T195 -10Q118 -10 86 19T53 87Q53 126 74 143T118 160Q133 160 146 151T160 120Q160 94 142 76T111 58Q109 57 108 57T107 55Q108 52 115 47T146 34T201 27Q237 27 263 38T301 66T318 97T323 122Q323 150 302 164T254 181T195 196T148 231Q131 256 131 289Z"></path>
<path stroke-width="1" id="E1-MJMATHI-74" d="M26 385Q19 392 19 395Q19 399 22 411T27 425Q29 430 36 430T87 431H140L159 511Q162 522 166 540T173 566T179 586T187 603T197 615T211 624T229 626Q247 625 254 615T261 596Q261 589 252 549T232 470L222 433Q222 431 272 431H323Q330 424 330 420Q330 398 317 385H210L174 240Q135 80 135 68Q135 26 162 26Q197 26 230 60T283 144Q285 150 288 151T303 153H307Q322 153 322 145Q322 142 319 133Q314 117 301 95T267 48T216 6T155 -11Q125 -11 98 4T59 56Q57 64 57 83V101L92 241Q127 382 128 383Q128 385 77 385H26Z"></path>
<path stroke-width="1" id="E1-MJMAIN-28" d="M94 250Q94 319 104 381T127 488T164 576T202 643T244 695T277 729T302 750H315H319Q333 750 333 741Q333 738 316 720T275 667T226 581T184 443T167 250T184 58T225 -81T274 -167T316 -220T333 -241Q333 -250 318 -250H315H302L274 -226Q180 -141 137 -14T94 250Z"></path>
<path stroke-width="1" id="E1-MJMATHI-70" d="M23 287Q24 290 25 295T30 317T40 348T55 381T75 411T101 433T134 442Q209 442 230 378L240 387Q302 442 358 442Q423 442 460 395T497 281Q497 173 421 82T249 -10Q227 -10 210 -4Q199 1 187 11T168 28L161 36Q160 35 139 -51T118 -138Q118 -144 126 -145T163 -148H188Q194 -155 194 -157T191 -175Q188 -187 185 -190T172 -194Q170 -194 161 -194T127 -193T65 -192Q-5 -192 -24 -194H-32Q-39 -187 -39 -183Q-37 -156 -26 -148H-6Q28 -147 33 -136Q36 -130 94 103T155 350Q156 355 156 364Q156 405 131 405Q109 405 94 377T71 316T59 280Q57 278 43 278H29Q23 284 23 287ZM178 102Q200 26 252 26Q282 26 310 49T356 107Q374 141 392 215T411 325V331Q411 405 350 405Q339 405 328 402T306 393T286 380T269 365T254 350T243 336T235 326L232 322Q232 321 229 308T218 264T204 212Q178 106 178 102Z"></path>
<path stroke-width="1" id="E1-MJMAIN-2C" d="M78 35T78 60T94 103T137 121Q165 121 187 96T210 8Q210 -27 201 -60T180 -117T154 -158T130 -185T117 -194Q113 -194 104 -185T95 -172Q95 -168 106 -156T131 -126T157 -76T173 -3V9L172 8Q170 7 167 6T161 3T152 1T140 0Q113 0 96 17Z"></path>
<path stroke-width="1" id="E1-MJMATHI-66" d="M118 -162Q120 -162 124 -164T135 -167T147 -168Q160 -168 171 -155T187 -126Q197 -99 221 27T267 267T289 382V385H242Q195 385 192 387Q188 390 188 397L195 425Q197 430 203 430T250 431Q298 431 298 432Q298 434 307 482T319 540Q356 705 465 705Q502 703 526 683T550 630Q550 594 529 578T487 561Q443 561 443 603Q443 622 454 636T478 657L487 662Q471 668 457 668Q445 668 434 658T419 630Q412 601 403 552T387 469T380 433Q380 431 435 431Q480 431 487 430T498 424Q499 420 496 407T491 391Q489 386 482 386T428 385H372L349 263Q301 15 282 -47Q255 -132 212 -173Q175 -205 139 -205Q107 -205 81 -186T55 -132Q55 -95 76 -78T118 -61Q162 -61 162 -103Q162 -122 151 -136T127 -157L118 -162Z"></path>
<path stroke-width="1" id="E1-MJMAIN-29" d="M60 749L64 750Q69 750 74 750H86L114 726Q208 641 251 514T294 250Q294 182 284 119T261 12T224 -76T186 -143T145 -194T113 -227T90 -246Q87 -249 86 -250H74Q66 -250 63 -250T58 -247T55 -238Q56 -237 66 -225Q221 -64 221 250T66 725Q56 737 55 738Q55 746 60 749Z"></path>
<path stroke-width="1" id="E1-MJMAIN-22C5" d="M78 250Q78 274 95 292T138 310Q162 310 180 294T199 251Q199 226 182 208T139 190T96 207T78 250Z"></path>
<path stroke-width="1" id="E1-MJMATHI-6C" d="M117 59Q117 26 142 26Q179 26 205 131Q211 151 215 152Q217 153 225 153H229Q238 153 241 153T246 151T248 144Q247 138 245 128T234 90T214 43T183 6T137 -11Q101 -11 70 11T38 85Q38 97 39 102L104 360Q167 615 167 623Q167 626 166 628T162 632T157 634T149 635T141 636T132 637T122 637Q112 637 109 637T101 638T95 641T94 647Q94 649 96 661Q101 680 107 682T179 688Q194 689 213 690T243 693T254 694Q266 694 266 686Q266 675 193 386T118 83Q118 81 118 75T117 65V59Z"></path>
<path stroke-width="1" id="E1-MJMAIN-3D" d="M56 347Q56 360 70 367H707Q722 359 722 347Q722 336 708 328L390 327H72Q56 332 56 347ZM56 153Q56 168 72 173H708Q722 163 722 153Q722 140 707 133H70Q56 140 56 153Z"></path>
<path stroke-width="1" id="E1-MJMATHI-63" d="M34 159Q34 268 120 355T306 442Q362 442 394 418T427 355Q427 326 408 306T360 285Q341 285 330 295T319 325T330 359T352 380T366 386H367Q367 388 361 392T340 400T306 404Q276 404 249 390Q228 381 206 359Q162 315 142 235T121 119Q121 73 147 50Q169 26 205 26H209Q321 26 394 111Q403 121 406 121Q410 121 419 112T429 98T420 83T391 55T346 25T282 0T202 -11Q127 -11 81 37T34 159Z"></path>
</defs>
<g stroke="currentColor" fill="currentColor" stroke-width="0" transform="matrix(1 0 0 -1 0 0)" aria-hidden="true">
 <use xlink:href="#E1-MJMATHI-64" x="0" y="0"></use>
 <use xlink:href="#E1-MJMATHI-69" x="523" y="0"></use>
 <use xlink:href="#E1-MJMATHI-73" x="869" y="0"></use>
 <use xlink:href="#E1-MJMATHI-74" x="1338" y="0"></use>
<g transform="translate(1866,0)">
 <use xlink:href="#E1-MJMAIN-28" x="0" y="0"></use>
 <use xlink:href="#E1-MJMATHI-70" x="389" y="0"></use>
 <use xlink:href="#E1-MJMAIN-2C" x="893" y="0"></use>
 <use xlink:href="#E1-MJMATHI-66" x="1338" y="0"></use>
 <use xlink:href="#E1-MJMAIN-29" x="1888" y="0"></use>
</g>
 <use xlink:href="#E1-MJMAIN-22C5" x="4367" y="0"></use>
 <use xlink:href="#E1-MJMATHI-64" x="4867" y="0"></use>
 <use xlink:href="#E1-MJMATHI-69" x="5391" y="0"></use>
 <use xlink:href="#E1-MJMATHI-73" x="5736" y="0"></use>
 <use xlink:href="#E1-MJMATHI-74" x="6206" y="0"></use>
<g transform="translate(6734,0)">
 <use xlink:href="#E1-MJMAIN-28" x="0" y="0"></use>
 <use xlink:href="#E1-MJMATHI-70" x="389" y="0"></use>
 <use xlink:href="#E1-MJMAIN-2C" x="893" y="0"></use>
 <use xlink:href="#E1-MJMATHI-6C" x="1338" y="0"></use>
 <use xlink:href="#E1-MJMAIN-29" x="1636" y="0"></use>
</g>
 <use xlink:href="#E1-MJMAIN-3D" x="9038" y="0"></use>
 <use xlink:href="#E1-MJMATHI-63" x="10094" y="0"></use>
</g>
</svg>
</div>
<p>These shapes are cousins of the <a href='/ovals-of-cassini-in-taxicab-geometry/'>ovals of Cassini</a>, which are a constant product of distances to two foci. Here, though, one of the foci is a line, so half the shape wraps a focus that extends to infinity:</p>
<figure class="figure-small"><img alt="A constant product of distances to a point and a line, in Euclidean geometry." src="/images/point-line-product-euclidean.svg" /><figcaption>A constant product of distances to a point and a line, in Euclidean geometry.</figcaption></figure>
<p>Similarly for taxicab geometry:</p>
<figure class="figure-small"><img alt="A constant product of distances to a point and a line, in taxicab geometry." src="/images/point-line-product-taxicab.svg" /><figcaption>A constant product of distances to a point and a line, in taxicab geometry.</figcaption></figure>
<p>Both can be fully disconnected:</p>
<figure class="figure-small"><img alt="Two disconnected components, in Euclidean geometry." src="/images/point-line-product-euclidean-2.svg" /><figcaption>Two disconnected components, in Euclidean geometry.</figcaption></figure>
<figure class="figure-small"><img alt="Two disconnected components, in taxicab geometry." src="/images/point-line-product-taxicab-2.svg" /><figcaption>Two disconnected components, in taxicab geometry.</figcaption></figure>
<p>or fully joined:</p>
<figure class="figure-small"><img alt="Two connected components, in Euclidean geometry." src="/images/point-line-product-euclidean-3.svg" /><figcaption>Two connected components, in Euclidean geometry.</figcaption></figure>
<figure class="figure-small"><img alt="Two connected components, in taxicab geometry." src="/images/point-line-product-taxicab-3.svg" /><figcaption>Two connected components, in taxicab geometry.</figcaption></figure>
<p>Interesting things happen to the taxicab shape when the directrix is neither horizontal or vertical. Here it is at 45° to the axes:</p>
<figure class="figure-small"><img alt="With the directrix at 45° to the axes, components just touching." src="/images/point-line-product-taxicab-4.svg" /><figcaption>With the directrix at 45° to the axes, components just touching.</figcaption></figure>
<figure class="figure-small"><img alt="Components disconnected." src="/images/point-line-product-taxicab-5.svg" /><figcaption>Components disconnected.</figcaption></figure>
<figure class="figure-small"><img alt="Components connected." src="/images/point-line-product-taxicab-6.svg" /><figcaption>Components connected.</figcaption></figure>
<p>With a sloped directrix, the shape becomes asymmetric (and, to my imagination, birdlike):</p>
<figure class="figure-small"><img alt="Asymmetric shape." src="/images/point-line-product-taxicab-7.svg" /><figcaption>Asymmetric shape.</figcaption></figure>
]]></content>
  </entry>
  <entry>
    <id>https://blog.exupero.org/point-line-difference-shapes</id>
    <link href="https://blog.exupero.org/point-line-difference-shapes"/>
    <title>Point-line difference shapes</title>
    <updated>2025-09-15T08:00:00+00:00</updated>
    <content type="html"><![CDATA[<p>Another shape without a common name is the one defined as a constant difference of distances to a focus and a directrix:</p>
<div class="formula"><svg xmlns:xlink="http://www.w3.org/1999/xlink" width="25.614ex" height="2.843ex" style="vertical-align: -0.838ex;" viewBox="0 -863.1 11028.2 1223.9" role="img" focusable="false" xmlns="http://www.w3.org/2000/svg" aria-labelledby="MathJax-SVG-1-Title">
<title id="MathJax-SVG-1-Title">d i s t left-parenthesis p comma f right-parenthesis minus d i s t left-parenthesis p comma l right-parenthesis equals c</title>
<defs aria-hidden="true">
<path stroke-width="1" id="E1-MJMATHI-64" d="M366 683Q367 683 438 688T511 694Q523 694 523 686Q523 679 450 384T375 83T374 68Q374 26 402 26Q411 27 422 35Q443 55 463 131Q469 151 473 152Q475 153 483 153H487H491Q506 153 506 145Q506 140 503 129Q490 79 473 48T445 8T417 -8Q409 -10 393 -10Q359 -10 336 5T306 36L300 51Q299 52 296 50Q294 48 292 46Q233 -10 172 -10Q117 -10 75 30T33 157Q33 205 53 255T101 341Q148 398 195 420T280 442Q336 442 364 400Q369 394 369 396Q370 400 396 505T424 616Q424 629 417 632T378 637H357Q351 643 351 645T353 664Q358 683 366 683ZM352 326Q329 405 277 405Q242 405 210 374T160 293Q131 214 119 129Q119 126 119 118T118 106Q118 61 136 44T179 26Q233 26 290 98L298 109L352 326Z"></path>
<path stroke-width="1" id="E1-MJMATHI-69" d="M184 600Q184 624 203 642T247 661Q265 661 277 649T290 619Q290 596 270 577T226 557Q211 557 198 567T184 600ZM21 287Q21 295 30 318T54 369T98 420T158 442Q197 442 223 419T250 357Q250 340 236 301T196 196T154 83Q149 61 149 51Q149 26 166 26Q175 26 185 29T208 43T235 78T260 137Q263 149 265 151T282 153Q302 153 302 143Q302 135 293 112T268 61T223 11T161 -11Q129 -11 102 10T74 74Q74 91 79 106T122 220Q160 321 166 341T173 380Q173 404 156 404H154Q124 404 99 371T61 287Q60 286 59 284T58 281T56 279T53 278T49 278T41 278H27Q21 284 21 287Z"></path>
<path stroke-width="1" id="E1-MJMATHI-73" d="M131 289Q131 321 147 354T203 415T300 442Q362 442 390 415T419 355Q419 323 402 308T364 292Q351 292 340 300T328 326Q328 342 337 354T354 372T367 378Q368 378 368 379Q368 382 361 388T336 399T297 405Q249 405 227 379T204 326Q204 301 223 291T278 274T330 259Q396 230 396 163Q396 135 385 107T352 51T289 7T195 -10Q118 -10 86 19T53 87Q53 126 74 143T118 160Q133 160 146 151T160 120Q160 94 142 76T111 58Q109 57 108 57T107 55Q108 52 115 47T146 34T201 27Q237 27 263 38T301 66T318 97T323 122Q323 150 302 164T254 181T195 196T148 231Q131 256 131 289Z"></path>
<path stroke-width="1" id="E1-MJMATHI-74" d="M26 385Q19 392 19 395Q19 399 22 411T27 425Q29 430 36 430T87 431H140L159 511Q162 522 166 540T173 566T179 586T187 603T197 615T211 624T229 626Q247 625 254 615T261 596Q261 589 252 549T232 470L222 433Q222 431 272 431H323Q330 424 330 420Q330 398 317 385H210L174 240Q135 80 135 68Q135 26 162 26Q197 26 230 60T283 144Q285 150 288 151T303 153H307Q322 153 322 145Q322 142 319 133Q314 117 301 95T267 48T216 6T155 -11Q125 -11 98 4T59 56Q57 64 57 83V101L92 241Q127 382 128 383Q128 385 77 385H26Z"></path>
<path stroke-width="1" id="E1-MJMAIN-28" d="M94 250Q94 319 104 381T127 488T164 576T202 643T244 695T277 729T302 750H315H319Q333 750 333 741Q333 738 316 720T275 667T226 581T184 443T167 250T184 58T225 -81T274 -167T316 -220T333 -241Q333 -250 318 -250H315H302L274 -226Q180 -141 137 -14T94 250Z"></path>
<path stroke-width="1" id="E1-MJMATHI-70" d="M23 287Q24 290 25 295T30 317T40 348T55 381T75 411T101 433T134 442Q209 442 230 378L240 387Q302 442 358 442Q423 442 460 395T497 281Q497 173 421 82T249 -10Q227 -10 210 -4Q199 1 187 11T168 28L161 36Q160 35 139 -51T118 -138Q118 -144 126 -145T163 -148H188Q194 -155 194 -157T191 -175Q188 -187 185 -190T172 -194Q170 -194 161 -194T127 -193T65 -192Q-5 -192 -24 -194H-32Q-39 -187 -39 -183Q-37 -156 -26 -148H-6Q28 -147 33 -136Q36 -130 94 103T155 350Q156 355 156 364Q156 405 131 405Q109 405 94 377T71 316T59 280Q57 278 43 278H29Q23 284 23 287ZM178 102Q200 26 252 26Q282 26 310 49T356 107Q374 141 392 215T411 325V331Q411 405 350 405Q339 405 328 402T306 393T286 380T269 365T254 350T243 336T235 326L232 322Q232 321 229 308T218 264T204 212Q178 106 178 102Z"></path>
<path stroke-width="1" id="E1-MJMAIN-2C" d="M78 35T78 60T94 103T137 121Q165 121 187 96T210 8Q210 -27 201 -60T180 -117T154 -158T130 -185T117 -194Q113 -194 104 -185T95 -172Q95 -168 106 -156T131 -126T157 -76T173 -3V9L172 8Q170 7 167 6T161 3T152 1T140 0Q113 0 96 17Z"></path>
<path stroke-width="1" id="E1-MJMATHI-66" d="M118 -162Q120 -162 124 -164T135 -167T147 -168Q160 -168 171 -155T187 -126Q197 -99 221 27T267 267T289 382V385H242Q195 385 192 387Q188 390 188 397L195 425Q197 430 203 430T250 431Q298 431 298 432Q298 434 307 482T319 540Q356 705 465 705Q502 703 526 683T550 630Q550 594 529 578T487 561Q443 561 443 603Q443 622 454 636T478 657L487 662Q471 668 457 668Q445 668 434 658T419 630Q412 601 403 552T387 469T380 433Q380 431 435 431Q480 431 487 430T498 424Q499 420 496 407T491 391Q489 386 482 386T428 385H372L349 263Q301 15 282 -47Q255 -132 212 -173Q175 -205 139 -205Q107 -205 81 -186T55 -132Q55 -95 76 -78T118 -61Q162 -61 162 -103Q162 -122 151 -136T127 -157L118 -162Z"></path>
<path stroke-width="1" id="E1-MJMAIN-29" d="M60 749L64 750Q69 750 74 750H86L114 726Q208 641 251 514T294 250Q294 182 284 119T261 12T224 -76T186 -143T145 -194T113 -227T90 -246Q87 -249 86 -250H74Q66 -250 63 -250T58 -247T55 -238Q56 -237 66 -225Q221 -64 221 250T66 725Q56 737 55 738Q55 746 60 749Z"></path>
<path stroke-width="1" id="E1-MJMAIN-2212" d="M84 237T84 250T98 270H679Q694 262 694 250T679 230H98Q84 237 84 250Z"></path>
<path stroke-width="1" id="E1-MJMATHI-6C" d="M117 59Q117 26 142 26Q179 26 205 131Q211 151 215 152Q217 153 225 153H229Q238 153 241 153T246 151T248 144Q247 138 245 128T234 90T214 43T183 6T137 -11Q101 -11 70 11T38 85Q38 97 39 102L104 360Q167 615 167 623Q167 626 166 628T162 632T157 634T149 635T141 636T132 637T122 637Q112 637 109 637T101 638T95 641T94 647Q94 649 96 661Q101 680 107 682T179 688Q194 689 213 690T243 693T254 694Q266 694 266 686Q266 675 193 386T118 83Q118 81 118 75T117 65V59Z"></path>
<path stroke-width="1" id="E1-MJMAIN-3D" d="M56 347Q56 360 70 367H707Q722 359 722 347Q722 336 708 328L390 327H72Q56 332 56 347ZM56 153Q56 168 72 173H708Q722 163 722 153Q722 140 707 133H70Q56 140 56 153Z"></path>
<path stroke-width="1" id="E1-MJMATHI-63" d="M34 159Q34 268 120 355T306 442Q362 442 394 418T427 355Q427 326 408 306T360 285Q341 285 330 295T319 325T330 359T352 380T366 386H367Q367 388 361 392T340 400T306 404Q276 404 249 390Q228 381 206 359Q162 315 142 235T121 119Q121 73 147 50Q169 26 205 26H209Q321 26 394 111Q403 121 406 121Q410 121 419 112T429 98T420 83T391 55T346 25T282 0T202 -11Q127 -11 81 37T34 159Z"></path>
</defs>
<g stroke="currentColor" fill="currentColor" stroke-width="0" transform="matrix(1 0 0 -1 0 0)" aria-hidden="true">
 <use xlink:href="#E1-MJMATHI-64" x="0" y="0"></use>
 <use xlink:href="#E1-MJMATHI-69" x="523" y="0"></use>
 <use xlink:href="#E1-MJMATHI-73" x="869" y="0"></use>
 <use xlink:href="#E1-MJMATHI-74" x="1338" y="0"></use>
<g transform="translate(1866,0)">
 <use xlink:href="#E1-MJMAIN-28" x="0" y="0"></use>
 <use xlink:href="#E1-MJMATHI-70" x="389" y="0"></use>
 <use xlink:href="#E1-MJMAIN-2C" x="893" y="0"></use>
 <use xlink:href="#E1-MJMATHI-66" x="1338" y="0"></use>
 <use xlink:href="#E1-MJMAIN-29" x="1888" y="0"></use>
</g>
 <use xlink:href="#E1-MJMAIN-2212" x="4367" y="0"></use>
 <use xlink:href="#E1-MJMATHI-64" x="5367" y="0"></use>
 <use xlink:href="#E1-MJMATHI-69" x="5891" y="0"></use>
 <use xlink:href="#E1-MJMATHI-73" x="6236" y="0"></use>
 <use xlink:href="#E1-MJMATHI-74" x="6706" y="0"></use>
<g transform="translate(7234,0)">
 <use xlink:href="#E1-MJMAIN-28" x="0" y="0"></use>
 <use xlink:href="#E1-MJMATHI-70" x="389" y="0"></use>
 <use xlink:href="#E1-MJMAIN-2C" x="893" y="0"></use>
 <use xlink:href="#E1-MJMATHI-6C" x="1338" y="0"></use>
 <use xlink:href="#E1-MJMAIN-29" x="1636" y="0"></use>
</g>
 <use xlink:href="#E1-MJMAIN-3D" x="9538" y="0"></use>
 <use xlink:href="#E1-MJMATHI-63" x="10594" y="0"></use>
</g>
</svg>
</div>
<p>In Euclidean geometry, these appear to be a parabola:</p>
<figure class="figure-small"><img alt="A parabolic shape defined by a constant difference of distances to a point and a line, in Euclidean geometry." src="/images/point-line-difference-euclidean.svg" /><figcaption>A parabolic shape defined by a constant difference of distances to a point and a line, in Euclidean geometry.</figcaption></figure>
<p>That makes sense, since a parabola is the set of points equidistant from a focus and a directrix, or having zero difference in distances.</p><p>Interestingly, though, this definition can also produce a kind of double parabola:</p>
<figure class="figure-small"><img alt="A double parabolic shape, in Euclidean geometry." src="/images/point-line-difference-euclidean-2.svg" /><figcaption>A double parabolic shape, in Euclidean geometry.</figcaption></figure>
<p>Taxicab geometry has analogs for both:</p>
<figure class="figure-small"><img alt="A parabolic shape, in taxicab geometry." src="/images/point-line-difference-taxicab.svg" /><figcaption>A parabolic shape, in taxicab geometry.</figcaption></figure>
<figure class="figure-small"><img alt="A double parabolic shape." src="/images/point-line-difference-taxicab-2.svg" /><figcaption>A double parabolic shape.</figcaption></figure>
<p>The double parabola above just looks like two angled lines, and to see them as overlapping parabloas requires some foreknowledge of what you're looking for.</p><p>With the directrix at 45° to the axes, the shape still looks like a taxicab parabola with a similarly sloped directrix:</p>
<figure class="figure-small"><img alt="A parabolic shape with the directrix at 45°." src="/images/point-line-difference-taxicab-3.svg" /><figcaption>A parabolic shape with the directrix at 45°.</figcaption></figure>
<p>When forming a double parabola against a directrix at 45°, the shape becomes two right angles:</p>
<figure class="figure-small"><img alt="A double parabolic shape with the directrix at 45°." src="/images/point-line-difference-taxicab-4.svg" /><figcaption>A double parabolic shape with the directrix at 45°.</figcaption></figure>
<p>With a sloped line, some foreknowledge again helps to see the underlying pair of overlapping parabolas:</p>
<figure class="figure-small"><img alt="A double parabolic shape, offset with one another." src="/images/point-line-difference-taxicab-5.svg" /><figcaption>A double parabolic shape, offset with one another.</figcaption></figure>
]]></content>
  </entry>
  <entry>
    <id>https://blog.exupero.org/point-line-sum-shapes</id>
    <link href="https://blog.exupero.org/point-line-sum-shapes"/>
    <title>Point-line sum shapes</title>
    <updated>2025-09-11T08:00:00+00:00</updated>
    <content type="html"><![CDATA[<p>In previous posts about taxicab geometry, I've illustrated shapes which have common names: <a href='/ellipses-in-taxicab-geometry/'>ellipse</a>, <a href='/parabolas-in-taxicab-geometry/'>parabola</a>, <a href='/hyperbolas-in-taxicab-geometry/'>hyperbola</a>, <a href='/ovals-of-cassini-in-taxicab-geometry/'>oval of Cassini</a>, and <a href='/circles-of-apollonius'>circle of Apollonius</a>. Occasionally I've had to distinguish between shapes which have different definitions but the same name in Euclidean geometry, because they present distinctly in taxicab geometry, specifically sum-based ellipses versus <a href='/directrix-based-ellipses-in-taxicab-geometry'>directrix-based ellipses</a>, and difference-based hyperbolas versus <a href='/directrix-based-hyperbolas-in-taxicab-geometry'>directrix-based hyperbolas</a>. Now, however, we turn to shapes that, as far as I can tell, don't have common names. (If you know a name for these shapes, please <a href="mailto:blog@exupero.org?subject=Point-line sum shapes">email me</a>.)</p><p>The first is a shape defined as a constant sum of the distances to a focus and a directrix:</p>
<div class="formula"><svg xmlns:xlink="http://www.w3.org/1999/xlink" width="25.614ex" height="2.843ex" style="vertical-align: -0.838ex;" viewBox="0 -863.1 11028.2 1223.9" role="img" focusable="false" xmlns="http://www.w3.org/2000/svg" aria-labelledby="MathJax-SVG-1-Title">
<title id="MathJax-SVG-1-Title">d i s t left-parenthesis p comma f right-parenthesis plus d i s t left-parenthesis p comma l right-parenthesis equals c</title>
<defs aria-hidden="true">
<path stroke-width="1" id="E1-MJMATHI-64" d="M366 683Q367 683 438 688T511 694Q523 694 523 686Q523 679 450 384T375 83T374 68Q374 26 402 26Q411 27 422 35Q443 55 463 131Q469 151 473 152Q475 153 483 153H487H491Q506 153 506 145Q506 140 503 129Q490 79 473 48T445 8T417 -8Q409 -10 393 -10Q359 -10 336 5T306 36L300 51Q299 52 296 50Q294 48 292 46Q233 -10 172 -10Q117 -10 75 30T33 157Q33 205 53 255T101 341Q148 398 195 420T280 442Q336 442 364 400Q369 394 369 396Q370 400 396 505T424 616Q424 629 417 632T378 637H357Q351 643 351 645T353 664Q358 683 366 683ZM352 326Q329 405 277 405Q242 405 210 374T160 293Q131 214 119 129Q119 126 119 118T118 106Q118 61 136 44T179 26Q233 26 290 98L298 109L352 326Z"></path>
<path stroke-width="1" id="E1-MJMATHI-69" d="M184 600Q184 624 203 642T247 661Q265 661 277 649T290 619Q290 596 270 577T226 557Q211 557 198 567T184 600ZM21 287Q21 295 30 318T54 369T98 420T158 442Q197 442 223 419T250 357Q250 340 236 301T196 196T154 83Q149 61 149 51Q149 26 166 26Q175 26 185 29T208 43T235 78T260 137Q263 149 265 151T282 153Q302 153 302 143Q302 135 293 112T268 61T223 11T161 -11Q129 -11 102 10T74 74Q74 91 79 106T122 220Q160 321 166 341T173 380Q173 404 156 404H154Q124 404 99 371T61 287Q60 286 59 284T58 281T56 279T53 278T49 278T41 278H27Q21 284 21 287Z"></path>
<path stroke-width="1" id="E1-MJMATHI-73" d="M131 289Q131 321 147 354T203 415T300 442Q362 442 390 415T419 355Q419 323 402 308T364 292Q351 292 340 300T328 326Q328 342 337 354T354 372T367 378Q368 378 368 379Q368 382 361 388T336 399T297 405Q249 405 227 379T204 326Q204 301 223 291T278 274T330 259Q396 230 396 163Q396 135 385 107T352 51T289 7T195 -10Q118 -10 86 19T53 87Q53 126 74 143T118 160Q133 160 146 151T160 120Q160 94 142 76T111 58Q109 57 108 57T107 55Q108 52 115 47T146 34T201 27Q237 27 263 38T301 66T318 97T323 122Q323 150 302 164T254 181T195 196T148 231Q131 256 131 289Z"></path>
<path stroke-width="1" id="E1-MJMATHI-74" d="M26 385Q19 392 19 395Q19 399 22 411T27 425Q29 430 36 430T87 431H140L159 511Q162 522 166 540T173 566T179 586T187 603T197 615T211 624T229 626Q247 625 254 615T261 596Q261 589 252 549T232 470L222 433Q222 431 272 431H323Q330 424 330 420Q330 398 317 385H210L174 240Q135 80 135 68Q135 26 162 26Q197 26 230 60T283 144Q285 150 288 151T303 153H307Q322 153 322 145Q322 142 319 133Q314 117 301 95T267 48T216 6T155 -11Q125 -11 98 4T59 56Q57 64 57 83V101L92 241Q127 382 128 383Q128 385 77 385H26Z"></path>
<path stroke-width="1" id="E1-MJMAIN-28" d="M94 250Q94 319 104 381T127 488T164 576T202 643T244 695T277 729T302 750H315H319Q333 750 333 741Q333 738 316 720T275 667T226 581T184 443T167 250T184 58T225 -81T274 -167T316 -220T333 -241Q333 -250 318 -250H315H302L274 -226Q180 -141 137 -14T94 250Z"></path>
<path stroke-width="1" id="E1-MJMATHI-70" d="M23 287Q24 290 25 295T30 317T40 348T55 381T75 411T101 433T134 442Q209 442 230 378L240 387Q302 442 358 442Q423 442 460 395T497 281Q497 173 421 82T249 -10Q227 -10 210 -4Q199 1 187 11T168 28L161 36Q160 35 139 -51T118 -138Q118 -144 126 -145T163 -148H188Q194 -155 194 -157T191 -175Q188 -187 185 -190T172 -194Q170 -194 161 -194T127 -193T65 -192Q-5 -192 -24 -194H-32Q-39 -187 -39 -183Q-37 -156 -26 -148H-6Q28 -147 33 -136Q36 -130 94 103T155 350Q156 355 156 364Q156 405 131 405Q109 405 94 377T71 316T59 280Q57 278 43 278H29Q23 284 23 287ZM178 102Q200 26 252 26Q282 26 310 49T356 107Q374 141 392 215T411 325V331Q411 405 350 405Q339 405 328 402T306 393T286 380T269 365T254 350T243 336T235 326L232 322Q232 321 229 308T218 264T204 212Q178 106 178 102Z"></path>
<path stroke-width="1" id="E1-MJMAIN-2C" d="M78 35T78 60T94 103T137 121Q165 121 187 96T210 8Q210 -27 201 -60T180 -117T154 -158T130 -185T117 -194Q113 -194 104 -185T95 -172Q95 -168 106 -156T131 -126T157 -76T173 -3V9L172 8Q170 7 167 6T161 3T152 1T140 0Q113 0 96 17Z"></path>
<path stroke-width="1" id="E1-MJMATHI-66" d="M118 -162Q120 -162 124 -164T135 -167T147 -168Q160 -168 171 -155T187 -126Q197 -99 221 27T267 267T289 382V385H242Q195 385 192 387Q188 390 188 397L195 425Q197 430 203 430T250 431Q298 431 298 432Q298 434 307 482T319 540Q356 705 465 705Q502 703 526 683T550 630Q550 594 529 578T487 561Q443 561 443 603Q443 622 454 636T478 657L487 662Q471 668 457 668Q445 668 434 658T419 630Q412 601 403 552T387 469T380 433Q380 431 435 431Q480 431 487 430T498 424Q499 420 496 407T491 391Q489 386 482 386T428 385H372L349 263Q301 15 282 -47Q255 -132 212 -173Q175 -205 139 -205Q107 -205 81 -186T55 -132Q55 -95 76 -78T118 -61Q162 -61 162 -103Q162 -122 151 -136T127 -157L118 -162Z"></path>
<path stroke-width="1" id="E1-MJMAIN-29" d="M60 749L64 750Q69 750 74 750H86L114 726Q208 641 251 514T294 250Q294 182 284 119T261 12T224 -76T186 -143T145 -194T113 -227T90 -246Q87 -249 86 -250H74Q66 -250 63 -250T58 -247T55 -238Q56 -237 66 -225Q221 -64 221 250T66 725Q56 737 55 738Q55 746 60 749Z"></path>
<path stroke-width="1" id="E1-MJMAIN-2B" d="M56 237T56 250T70 270H369V420L370 570Q380 583 389 583Q402 583 409 568V270H707Q722 262 722 250T707 230H409V-68Q401 -82 391 -82H389H387Q375 -82 369 -68V230H70Q56 237 56 250Z"></path>
<path stroke-width="1" id="E1-MJMATHI-6C" d="M117 59Q117 26 142 26Q179 26 205 131Q211 151 215 152Q217 153 225 153H229Q238 153 241 153T246 151T248 144Q247 138 245 128T234 90T214 43T183 6T137 -11Q101 -11 70 11T38 85Q38 97 39 102L104 360Q167 615 167 623Q167 626 166 628T162 632T157 634T149 635T141 636T132 637T122 637Q112 637 109 637T101 638T95 641T94 647Q94 649 96 661Q101 680 107 682T179 688Q194 689 213 690T243 693T254 694Q266 694 266 686Q266 675 193 386T118 83Q118 81 118 75T117 65V59Z"></path>
<path stroke-width="1" id="E1-MJMAIN-3D" d="M56 347Q56 360 70 367H707Q722 359 722 347Q722 336 708 328L390 327H72Q56 332 56 347ZM56 153Q56 168 72 173H708Q722 163 722 153Q722 140 707 133H70Q56 140 56 153Z"></path>
<path stroke-width="1" id="E1-MJMATHI-63" d="M34 159Q34 268 120 355T306 442Q362 442 394 418T427 355Q427 326 408 306T360 285Q341 285 330 295T319 325T330 359T352 380T366 386H367Q367 388 361 392T340 400T306 404Q276 404 249 390Q228 381 206 359Q162 315 142 235T121 119Q121 73 147 50Q169 26 205 26H209Q321 26 394 111Q403 121 406 121Q410 121 419 112T429 98T420 83T391 55T346 25T282 0T202 -11Q127 -11 81 37T34 159Z"></path>
</defs>
<g stroke="currentColor" fill="currentColor" stroke-width="0" transform="matrix(1 0 0 -1 0 0)" aria-hidden="true">
 <use xlink:href="#E1-MJMATHI-64" x="0" y="0"></use>
 <use xlink:href="#E1-MJMATHI-69" x="523" y="0"></use>
 <use xlink:href="#E1-MJMATHI-73" x="869" y="0"></use>
 <use xlink:href="#E1-MJMATHI-74" x="1338" y="0"></use>
<g transform="translate(1866,0)">
 <use xlink:href="#E1-MJMAIN-28" x="0" y="0"></use>
 <use xlink:href="#E1-MJMATHI-70" x="389" y="0"></use>
 <use xlink:href="#E1-MJMAIN-2C" x="893" y="0"></use>
 <use xlink:href="#E1-MJMATHI-66" x="1338" y="0"></use>
 <use xlink:href="#E1-MJMAIN-29" x="1888" y="0"></use>
</g>
 <use xlink:href="#E1-MJMAIN-2B" x="4367" y="0"></use>
 <use xlink:href="#E1-MJMATHI-64" x="5367" y="0"></use>
 <use xlink:href="#E1-MJMATHI-69" x="5891" y="0"></use>
 <use xlink:href="#E1-MJMATHI-73" x="6236" y="0"></use>
 <use xlink:href="#E1-MJMATHI-74" x="6706" y="0"></use>
<g transform="translate(7234,0)">
 <use xlink:href="#E1-MJMAIN-28" x="0" y="0"></use>
 <use xlink:href="#E1-MJMATHI-70" x="389" y="0"></use>
 <use xlink:href="#E1-MJMAIN-2C" x="893" y="0"></use>
 <use xlink:href="#E1-MJMATHI-6C" x="1338" y="0"></use>
 <use xlink:href="#E1-MJMAIN-29" x="1636" y="0"></use>
</g>
 <use xlink:href="#E1-MJMAIN-3D" x="9538" y="0"></use>
 <use xlink:href="#E1-MJMATHI-63" x="10594" y="0"></use>
</g>
</svg>
</div>
<p>In Euclidean geometry, these are lens-shaped but asymmetric:</p>
<figure class="figure-small"><img alt="A shape defined by a constant sum of distances to a point and a line, in Euclidean geometry." src="/images/point-line-sum-euclidean.svg" /><figcaption>A shape defined by a constant sum of distances to a point and a line, in Euclidean geometry.</figcaption></figure>
<p>Taxicab geometry's versions seem to be hexagonal approximations of the Euclidean shape:</p>
<figure class="figure-small"><img alt="A shape defined by a constant sum of distances to a point and a line, in taxicab geometry." src="/images/point-line-sum-taxicab.svg" /><figcaption>A shape defined by a constant sum of distances to a point and a line, in taxicab geometry.</figcaption></figure>
<figure class="figure-small"><img alt="With a directrix at 45° to the axes." src="/images/point-line-sum-taxicab-2.svg" /><figcaption>With a directrix at 45° to the axes.</figcaption></figure>
<figure class="figure-small"><img alt="With a directrix neither vertical, horizontal, nor at 45° to the axes." src="/images/point-line-sum-taxicab-3.svg" /><figcaption>With a directrix neither vertical, horizontal, nor at 45° to the axes.</figcaption></figure>
<p>The only other case seems to be the occasional pentagon:</p>
<figure class="figure-small"><img alt="A five-sided shape defined by a constant sum of distances to a point and a line, in taxicab geometry." src="/images/point-line-sum-taxicab-4.svg" /><figcaption>A five-sided shape defined by a constant sum of distances to a point and a line, in taxicab geometry.</figcaption></figure>
]]></content>
  </entry>
  <entry>
    <id>https://blog.exupero.org/circles-of-apollonius</id>
    <link href="https://blog.exupero.org/circles-of-apollonius"/>
    <title>Circles of Apollonius</title>
    <updated>2025-09-08T08:00:00+00:00</updated>
    <content type="html"><![CDATA[<p>A <a href='https://en.wikipedia.org/wiki/Circles_of_Apollonius'>circle of Apollonius</a> is the set of points an equal ratio of distances from two foci. Stated algebraically,</p>
<div class="formula"><svg xmlns:xlink="http://www.w3.org/1999/xlink" width="15.483ex" height="6.509ex" style="vertical-align: -2.671ex;" viewBox="0 -1652.5 6666.3 2802.6" role="img" focusable="false" xmlns="http://www.w3.org/2000/svg" aria-labelledby="MathJax-SVG-1-Title">
<title id="MathJax-SVG-1-Title">StartFraction d i s t left-parenthesis p comma f 1 right-parenthesis Over d i s t left-parenthesis p comma f 2 right-parenthesis EndFraction equals c</title>
<defs aria-hidden="true">
<path stroke-width="1" id="E1-MJMATHI-64" d="M366 683Q367 683 438 688T511 694Q523 694 523 686Q523 679 450 384T375 83T374 68Q374 26 402 26Q411 27 422 35Q443 55 463 131Q469 151 473 152Q475 153 483 153H487H491Q506 153 506 145Q506 140 503 129Q490 79 473 48T445 8T417 -8Q409 -10 393 -10Q359 -10 336 5T306 36L300 51Q299 52 296 50Q294 48 292 46Q233 -10 172 -10Q117 -10 75 30T33 157Q33 205 53 255T101 341Q148 398 195 420T280 442Q336 442 364 400Q369 394 369 396Q370 400 396 505T424 616Q424 629 417 632T378 637H357Q351 643 351 645T353 664Q358 683 366 683ZM352 326Q329 405 277 405Q242 405 210 374T160 293Q131 214 119 129Q119 126 119 118T118 106Q118 61 136 44T179 26Q233 26 290 98L298 109L352 326Z"></path>
<path stroke-width="1" id="E1-MJMATHI-69" d="M184 600Q184 624 203 642T247 661Q265 661 277 649T290 619Q290 596 270 577T226 557Q211 557 198 567T184 600ZM21 287Q21 295 30 318T54 369T98 420T158 442Q197 442 223 419T250 357Q250 340 236 301T196 196T154 83Q149 61 149 51Q149 26 166 26Q175 26 185 29T208 43T235 78T260 137Q263 149 265 151T282 153Q302 153 302 143Q302 135 293 112T268 61T223 11T161 -11Q129 -11 102 10T74 74Q74 91 79 106T122 220Q160 321 166 341T173 380Q173 404 156 404H154Q124 404 99 371T61 287Q60 286 59 284T58 281T56 279T53 278T49 278T41 278H27Q21 284 21 287Z"></path>
<path stroke-width="1" id="E1-MJMATHI-73" d="M131 289Q131 321 147 354T203 415T300 442Q362 442 390 415T419 355Q419 323 402 308T364 292Q351 292 340 300T328 326Q328 342 337 354T354 372T367 378Q368 378 368 379Q368 382 361 388T336 399T297 405Q249 405 227 379T204 326Q204 301 223 291T278 274T330 259Q396 230 396 163Q396 135 385 107T352 51T289 7T195 -10Q118 -10 86 19T53 87Q53 126 74 143T118 160Q133 160 146 151T160 120Q160 94 142 76T111 58Q109 57 108 57T107 55Q108 52 115 47T146 34T201 27Q237 27 263 38T301 66T318 97T323 122Q323 150 302 164T254 181T195 196T148 231Q131 256 131 289Z"></path>
<path stroke-width="1" id="E1-MJMATHI-74" d="M26 385Q19 392 19 395Q19 399 22 411T27 425Q29 430 36 430T87 431H140L159 511Q162 522 166 540T173 566T179 586T187 603T197 615T211 624T229 626Q247 625 254 615T261 596Q261 589 252 549T232 470L222 433Q222 431 272 431H323Q330 424 330 420Q330 398 317 385H210L174 240Q135 80 135 68Q135 26 162 26Q197 26 230 60T283 144Q285 150 288 151T303 153H307Q322 153 322 145Q322 142 319 133Q314 117 301 95T267 48T216 6T155 -11Q125 -11 98 4T59 56Q57 64 57 83V101L92 241Q127 382 128 383Q128 385 77 385H26Z"></path>
<path stroke-width="1" id="E1-MJMAIN-28" d="M94 250Q94 319 104 381T127 488T164 576T202 643T244 695T277 729T302 750H315H319Q333 750 333 741Q333 738 316 720T275 667T226 581T184 443T167 250T184 58T225 -81T274 -167T316 -220T333 -241Q333 -250 318 -250H315H302L274 -226Q180 -141 137 -14T94 250Z"></path>
<path stroke-width="1" id="E1-MJMATHI-70" d="M23 287Q24 290 25 295T30 317T40 348T55 381T75 411T101 433T134 442Q209 442 230 378L240 387Q302 442 358 442Q423 442 460 395T497 281Q497 173 421 82T249 -10Q227 -10 210 -4Q199 1 187 11T168 28L161 36Q160 35 139 -51T118 -138Q118 -144 126 -145T163 -148H188Q194 -155 194 -157T191 -175Q188 -187 185 -190T172 -194Q170 -194 161 -194T127 -193T65 -192Q-5 -192 -24 -194H-32Q-39 -187 -39 -183Q-37 -156 -26 -148H-6Q28 -147 33 -136Q36 -130 94 103T155 350Q156 355 156 364Q156 405 131 405Q109 405 94 377T71 316T59 280Q57 278 43 278H29Q23 284 23 287ZM178 102Q200 26 252 26Q282 26 310 49T356 107Q374 141 392 215T411 325V331Q411 405 350 405Q339 405 328 402T306 393T286 380T269 365T254 350T243 336T235 326L232 322Q232 321 229 308T218 264T204 212Q178 106 178 102Z"></path>
<path stroke-width="1" id="E1-MJMAIN-2C" d="M78 35T78 60T94 103T137 121Q165 121 187 96T210 8Q210 -27 201 -60T180 -117T154 -158T130 -185T117 -194Q113 -194 104 -185T95 -172Q95 -168 106 -156T131 -126T157 -76T173 -3V9L172 8Q170 7 167 6T161 3T152 1T140 0Q113 0 96 17Z"></path>
<path stroke-width="1" id="E1-MJMATHI-66" d="M118 -162Q120 -162 124 -164T135 -167T147 -168Q160 -168 171 -155T187 -126Q197 -99 221 27T267 267T289 382V385H242Q195 385 192 387Q188 390 188 397L195 425Q197 430 203 430T250 431Q298 431 298 432Q298 434 307 482T319 540Q356 705 465 705Q502 703 526 683T550 630Q550 594 529 578T487 561Q443 561 443 603Q443 622 454 636T478 657L487 662Q471 668 457 668Q445 668 434 658T419 630Q412 601 403 552T387 469T380 433Q380 431 435 431Q480 431 487 430T498 424Q499 420 496 407T491 391Q489 386 482 386T428 385H372L349 263Q301 15 282 -47Q255 -132 212 -173Q175 -205 139 -205Q107 -205 81 -186T55 -132Q55 -95 76 -78T118 -61Q162 -61 162 -103Q162 -122 151 -136T127 -157L118 -162Z"></path>
<path stroke-width="1" id="E1-MJMAIN-31" d="M213 578L200 573Q186 568 160 563T102 556H83V602H102Q149 604 189 617T245 641T273 663Q275 666 285 666Q294 666 302 660V361L303 61Q310 54 315 52T339 48T401 46H427V0H416Q395 3 257 3Q121 3 100 0H88V46H114Q136 46 152 46T177 47T193 50T201 52T207 57T213 61V578Z"></path>
<path stroke-width="1" id="E1-MJMAIN-29" d="M60 749L64 750Q69 750 74 750H86L114 726Q208 641 251 514T294 250Q294 182 284 119T261 12T224 -76T186 -143T145 -194T113 -227T90 -246Q87 -249 86 -250H74Q66 -250 63 -250T58 -247T55 -238Q56 -237 66 -225Q221 -64 221 250T66 725Q56 737 55 738Q55 746 60 749Z"></path>
<path stroke-width="1" id="E1-MJMAIN-32" d="M109 429Q82 429 66 447T50 491Q50 562 103 614T235 666Q326 666 387 610T449 465Q449 422 429 383T381 315T301 241Q265 210 201 149L142 93L218 92Q375 92 385 97Q392 99 409 186V189H449V186Q448 183 436 95T421 3V0H50V19V31Q50 38 56 46T86 81Q115 113 136 137Q145 147 170 174T204 211T233 244T261 278T284 308T305 340T320 369T333 401T340 431T343 464Q343 527 309 573T212 619Q179 619 154 602T119 569T109 550Q109 549 114 549Q132 549 151 535T170 489Q170 464 154 447T109 429Z"></path>
<path stroke-width="1" id="E1-MJMAIN-3D" d="M56 347Q56 360 70 367H707Q722 359 722 347Q722 336 708 328L390 327H72Q56 332 56 347ZM56 153Q56 168 72 173H708Q722 163 722 153Q722 140 707 133H70Q56 140 56 153Z"></path>
<path stroke-width="1" id="E1-MJMATHI-63" d="M34 159Q34 268 120 355T306 442Q362 442 394 418T427 355Q427 326 408 306T360 285Q341 285 330 295T319 325T330 359T352 380T366 386H367Q367 388 361 392T340 400T306 404Q276 404 249 390Q228 381 206 359Q162 315 142 235T121 119Q121 73 147 50Q169 26 205 26H209Q321 26 394 111Q403 121 406 121Q410 121 419 112T429 98T420 83T391 55T346 25T282 0T202 -11Q127 -11 81 37T34 159Z"></path>
</defs>
<g stroke="currentColor" fill="currentColor" stroke-width="0" transform="matrix(1 0 0 -1 0 0)" aria-hidden="true">
<g transform="translate(120,0)">
<rect stroke="none" width="4658" height="60" x="0" y="220"></rect>
<g transform="translate(60,770)">
 <use xlink:href="#E1-MJMATHI-64" x="0" y="0"></use>
 <use xlink:href="#E1-MJMATHI-69" x="523" y="0"></use>
 <use xlink:href="#E1-MJMATHI-73" x="869" y="0"></use>
 <use xlink:href="#E1-MJMATHI-74" x="1338" y="0"></use>
<g transform="translate(1866,0)">
 <use xlink:href="#E1-MJMAIN-28" x="0" y="0"></use>
 <use xlink:href="#E1-MJMATHI-70" x="389" y="0"></use>
 <use xlink:href="#E1-MJMAIN-2C" x="893" y="0"></use>
<g transform="translate(1338,0)">
 <use xlink:href="#E1-MJMATHI-66" x="0" y="0"></use>
 <use transform="scale(0.707)" xlink:href="#E1-MJMAIN-31" x="693" y="-213"></use>
</g>
 <use xlink:href="#E1-MJMAIN-29" x="2282" y="0"></use>
</g>
</g>
<g transform="translate(60,-771)">
 <use xlink:href="#E1-MJMATHI-64" x="0" y="0"></use>
 <use xlink:href="#E1-MJMATHI-69" x="523" y="0"></use>
 <use xlink:href="#E1-MJMATHI-73" x="869" y="0"></use>
 <use xlink:href="#E1-MJMATHI-74" x="1338" y="0"></use>
<g transform="translate(1866,0)">
 <use xlink:href="#E1-MJMAIN-28" x="0" y="0"></use>
 <use xlink:href="#E1-MJMATHI-70" x="389" y="0"></use>
 <use xlink:href="#E1-MJMAIN-2C" x="893" y="0"></use>
<g transform="translate(1338,0)">
 <use xlink:href="#E1-MJMATHI-66" x="0" y="0"></use>
 <use transform="scale(0.707)" xlink:href="#E1-MJMAIN-32" x="693" y="-213"></use>
</g>
 <use xlink:href="#E1-MJMAIN-29" x="2282" y="0"></use>
</g>
</g>
</g>
 <use xlink:href="#E1-MJMAIN-3D" x="5176" y="0"></use>
 <use xlink:href="#E1-MJMATHI-63" x="6232" y="0"></use>
</g>
</svg>
</div>
<p>As the name indicates, in Euclidean geometry this definition produces circles:</p>
<figure class="figure-small"><img alt="A circle of Apollonius in Euclidean geometry, with a distance ratio of 2 to 1." src="/images/circle-of-apollonius-euclidean.svg" /><figcaption>A circle of Apollonius in Euclidean geometry, with a distance ratio of 2 to 1.</figcaption></figure>
<p>In <a href='https://en.wikipedia.org/wiki/Taxicab_geometry'>taxicab geometry</a>, it can produce a <a href='https://en.wikipedia.org/wiki/Kite_&#40;geometry&#41;'>kite</a>:</p>
<figure class="figure-small"><img alt="A circle of Apollonius in taxicab geometry, also with a distance ratio of 2 to 1." src="/images/circle-of-apollonius-taxicab.svg" /><figcaption>A circle of Apollonius in taxicab geometry, also with a distance ratio of 2 to 1.</figcaption></figure>
<p>Or a trapezoid:</p>
<figure class="figure-small"><img alt="Another circle of Apollonius in taxicab geometry, with a distance ratio of 2 to 1." src="/images/circle-of-apollonius-taxicab-2.svg" /><figcaption>Another circle of Apollonius in taxicab geometry, with a distance ratio of 2 to 1.</figcaption></figure>
<p>Given these two examples, and the fact that in Euclidean geometry circles of Apollonius are always circles, it's tempting to think that in taxicab geometry a circle of Apollonius is another way of defining a <a href='/directrix-based-ellipses-in-taxicab-geometry'>conic ellipse</a>. But it's not. Here's a circle of Apollonius that isn't the cross section of a pyramid:</p>
<figure class="figure-small"><img alt="An asymmetric circle of Apollonius in taxicab geometry." src="/images/circle-of-apollonius-taxicab-3.svg" /><figcaption>An asymmetric circle of Apollonius in taxicab geometry.</figcaption></figure>
<p>The jut from the lower corner of what would otherwise be a trapezoid is an interesting feature of circles of Apollonius in taxicab geometry. To understand why it appears, consider the case when the ratio of distances to each focus is 1. When that happens, the circle of Apollonius is equidistant from each focus, making the shape the set of points equidistant from both foci. In Euclidean geometry, that's a perpendicular bisector. Here are several circles between the same foci, with distance ratios approaching 1:</p>
<figure class="figure-small"><img alt="Four Euclidean circles of Apollonius between the same two foci, with distance ratios approaching 1." src="/images/circles-of-apollonius-euclidean.svg" /><figcaption>Four Euclidean circles of Apollonius between the same two foci, with distance ratios approaching 1.</figcaption></figure>
<p>When the ratio is exactly 1, the circle's radius is infinite and the shape is a perpendicular bisector.</p><p>The same happens in taxicab geometry, where the set of points equidistant from two foci is a <a href='https://en.wikipedia.org/wiki/Degeneracy_(mathematics&#41;'>degenerate</a> case of <a href='/hyperbolas-in-taxicab-geometry'>hyperbola</a>. I typically call such a shape a "midset", since it's frequently not a single line nor perpendicular, more often a line with a pair of bends in it. It's also a circle of Apollonius with a distance ratio of 1:</p>
<figure class="figure-small"><img alt="Four taxicab circles of Apollonius between the same two foci, with distance ratios approaching 1." src="/images/circles-of-apollonius-taxicab.svg" /><figcaption>Four taxicab circles of Apollonius between the same two foci, with distance ratios approaching 1.</figcaption></figure>
<p>The jut off one corner of some circles of Apollonius is how a growing shape transforms from a trapezoid into a midset.</p>
]]></content>
  </entry>
  <entry>
    <id>https://blog.exupero.org/distance-based-shapes</id>
    <link href="https://blog.exupero.org/distance-based-shapes"/>
    <title>Distance-based shapes</title>
    <updated>2025-09-04T08:00:00+00:00</updated>
    <content type="html"><![CDATA[<p>A few weeks ago I <a href='/directrix-based-ellipses-in-taxicab-geometry'>wrote</a> <a href='/directrix-based-hyperbolas-in-taxicab-geometry'>about</a> how ellipses and hyperbolas have multiple definitions, which in Euclidean geometry are equivalent but in taxicab geometry produce different shapes. Ellipses can be defined using the sum of the distances to two foci, or as a specific range of ratios of the distances to a focus and a directrix (a line). Similarly, hyperbolas can be defined using the difference of the distances to two foci, or as another range of ratios of the distances to a focus and a directrix. Definitions based on ratio of the distances to a point and a line produce conic section. Since <a href='/ovals-of-cassini-in-taxicab-geometry'>ovals of Cassini</a> use the product of the distances to two foci, we can start to fill in a table of distance-based shapes:</p>
<table><thead><tr><th>□</th><th>dist(p, f₁) □ dist(p, f₂)</th><th>dist(p, f) □ dist(p, d)</th></tr></thead><tbody><tr><th>+</th><td>Ellipse<br />• circle when f₁ = f₂</td><td></td></tr><tr><th>−</th><td>Hyperbola</td><td></td></tr><tr><th>×</th><td>Oval of Cassini</td><td></td></tr><tr><th>÷</th><td></td><td>Conic section<br />• ellipse when ratio &lt; 1<br />• parabola when ratio = 1<br />• hyperbola when ratio &gt; 1</td></tr></tbody></table>
<p>Filling in the lower-left gap, I learned that the shape based on a ratio of the distances two foci is called a <a href='https://en.wikipedia.org/wiki/Circles_of_Apollonius'>circle of Apollonius</a>. However, I haven't found names for the shapes based on the sum, difference, or product of the distances to a focus and a directrix. (AI has suggested <a href='https://en.wikipedia.org/wiki/Lima%C3%A7on'>limaçon</a>, which as far as I can tell is unrelated.) If you have suggestions, please <a href="mailto:blog@exupero.org?subject=Distance-based shapes">email me</a>.</p>
<table><thead><tr><th>□</th><th>dist(p, f₁) □ dist(p, f₂)</th><th>dist(p, f) □ dist(p, d)</th></tr></thead><tbody><tr><th>+</th><td>Ellipse<br />• circle when f₁ = f₂</td><td>?</td></tr><tr><th>−</th><td>Hyperbola</td><td>?</td></tr><tr><th>×</th><td>Oval of Cassini</td><td>?</td></tr><tr><th>÷</th><td>Circle of Apollonius</td><td>Conic section<br />• ellipse when ratio &lt; 1<br />• parabola when ratio = 1<br />• hyperbola when ratio &gt; 1</td></tr></tbody></table>
<p>Names or not, in the next few posts I'll illustrate each shape in both Euclidean and taxicab geometries.</p>
]]></content>
  </entry>
  <entry>
    <id>https://blog.exupero.org/double-tars</id>
    <link href="https://blog.exupero.org/double-tars"/>
    <title>Double TARS</title>
    <updated>2025-08-15T08:00:00+00:00</updated>
    <content type="html"><![CDATA[<p>In the <a href='/tars-and-angular-momentum'>previous post</a> I discussed how the <a href='https://arxiv.org/abs/2507.17615'>TARS concept</a> could take advantage of the conservation of angular momentum to reach its maximum launch speed sooner by drawing mass in toward its axis of rotation, like a figure skater drawing their arms in. Besides reaching max speed sooner, fully drawing in the sheet would also hide the reflective surface area, thus cutting solar pressure and stopping runaway acceleration of spin that would eventually tear the sheet apart. Now that we can preserve the sheet, we need to figure out how to slow down its spin so new payloads can be added.</p><p>One possibility might be to have a solar panel powering an electric motor that can counter the sheet's spin. A more in-kind solution would be to attach the TARS sheet to a second TARS sheet that has its reflectivity reversed, like this:</p>
<figure class="figure-small"><svg viewBox="0 0 100 150" width="100%"><rect width="100%" height="100%" fill="white"></rect><g transform="translate(50.0,0.0)"><g data-name="spin-indicator-back" transform="translate(0.0,75.0)"></g><g><g data-name="top-sheet" transform="scale(0.5,0.5)"><g transform="scale(1.0,0.75)"><path d="M0,0 Q15,0 20,50 Q25,99 50,99 L50,101 Q25,101 20,150 Q15,200 0,200 Z" fill="hsl(0,0%,70%)"></path><path d="M0,0 Q15,0 20,50 Q25,99 50,99 L50,101 Q25,101 20,150 Q15,200 0,200 Z" fill="hsl(0,0%,30%)" transform="scale(-1.0,1.0)"></path></g></g><g data-name="bottom-sheet" transform="scale(-0.5,0.5)translate(0.0,150.0)"><g transform="scale(1.0,0.75)"><path d="M0,0 Q15,0 20,50 Q25,99 50,99 L50,101 Q25,101 20,150 Q15,200 0,200 Z" fill="hsl(0,0%,70%)"></path><path d="M0,0 Q15,0 20,50 Q25,99 50,99 L50,101 Q25,101 20,150 Q15,200 0,200 Z" fill="hsl(0,0%,30%)" transform="scale(-1.0,1.0)"></path></g></g><path d="M0,0 L0,150" stroke-width="1" stroke="black"></path></g><g data-name="payload-launch" style="display: none"><g transform="translate(0.0,37.5)"><g><path d="M3,0 L46,0" stroke="steelblue"></path><path d="M45,-1 L47,0 L45,1 Z" fill="steelblue"></path><rect fill="black" height="2" width="2" x="48" y="-1"></rect></g></g><g transform="translate(0.0,112.5)"><g><path d="M3,0 L46,0" stroke="steelblue"></path><path d="M45,-1 L47,0 L45,1 Z" fill="steelblue"></path><rect fill="black" height="2" width="2" x="48" y="-1"></rect></g></g></g><g data-name="spin-indicator-front" transform="translate(0.0,75.0)"></g></g></svg><figcaption>Two TARS sheets with reversed reflectivity attached on their axis of rotation.</figcaption></figure>
<p>In the initial setup, only one sheet would be unfurled, allowing solar pressure to initiate spin:</p>
<figure class="figure-small"><svg viewBox="0 0 100 150" width="100%"><rect width="100%" height="100%" fill="white"></rect><g transform="translate(50.0,0.0)"><g data-name="spin-indicator-back" transform="translate(0.0,75.0)"><path d="M15,0 A15,5.0 0 0 0 -15,0" data-name="spin-indicator-line" fill="none" stroke="red"></path></g><g><g data-name="top-sheet" transform="scale(0.5,0.5)"><g transform="scale(1.0,0.75)"><path d="M0,0 Q15,0 20,50 Q25,99 50,99 L50,101 Q25,101 20,150 Q15,200 0,200 Z" fill="hsl(0,0%,70%)"></path><path d="M0,0 Q15,0 20,50 Q25,99 50,99 L50,101 Q25,101 20,150 Q15,200 0,200 Z" fill="hsl(0,0%,30%)" transform="scale(-1.0,1.0)"></path></g></g><g data-name="bottom-sheet" transform="scale(0.1,1.0)scale(-0.5,0.5)translate(0.0,150.0)"><g transform="scale(1.0,0.75)"><path d="M0,0 Q15,0 20,50 Q25,99 50,99 L50,101 Q25,101 20,150 Q15,200 0,200 Z" fill="hsl(0,0%,70%)"></path><path d="M0,0 Q15,0 20,50 Q25,99 50,99 L50,101 Q25,101 20,150 Q15,200 0,200 Z" fill="hsl(0,0%,30%)" transform="scale(-1.0,1.0)"></path></g></g><path d="M0,0 L0,150" stroke-width="1" stroke="black"></path></g><g data-name="payload-launch" style="display: none"><g transform="translate(0.0,37.5)"><g><path d="M3,0 L46,0" stroke="steelblue"></path><path d="M45,-1 L47,0 L45,1 Z" fill="steelblue"></path><rect fill="black" height="2" width="2" x="48" y="-1"></rect></g></g><g transform="translate(0.0,112.5)"><g><path d="M3,0 L46,0" stroke="steelblue"></path><path d="M45,-1 L47,0 L45,1 Z" fill="steelblue"></path><rect fill="black" height="2" width="2" x="48" y="-1"></rect></g></g></g><g data-name="spin-indicator-front" transform="translate(0.0,75.0)"><g><path d="M-15,0 A15,5.0 0 0 0 15,0" data-name="spin-indicator-line" fill="none" stroke="red"></path><g data-name="spin-indicator-arrows"><path d="M3,0 L-1.0,-2 L-3,0 Z" data-name="spin-indicator-arrow" fill="red" transform="translate(15.0,0.0)"></path><path d="M3,0 L-1.0,-2 L-3,0 Z" data-name="spin-indicator-arrow" fill="red" transform="rotate(180.0)translate(15.0,0.0)"></path></g></g></g></g></svg><figcaption>One sheet unfurled causes spin.</figcaption></figure>
<p>Once the assembly is spinning fast enough, the extended sheet is pulled in, increasing its speed by conservation of angular momentum and approaching the limits of the material's tensile strength. At that point payloads can be released from both sheets, which are spinning at the same rate:</p>
<figure class="figure-small"><svg viewBox="0 0 100 150" width="100%"><rect width="100%" height="100%" fill="white"></rect><g transform="translate(50.0,0.0)"><g data-name="spin-indicator-back" transform="translate(0.0,75.0)"><path d="M8,0 A8,2.6666667 0 0 0 -8,0" data-name="spin-indicator-line" fill="none" stroke="red"></path></g><g><g data-name="top-sheet" transform="scale(0.1,1.0)scale(0.5,0.5)"><g transform="scale(1.0,0.75)"><path d="M0,0 Q15,0 20,50 Q25,99 50,99 L50,101 Q25,101 20,150 Q15,200 0,200 Z" fill="hsl(0,0%,70%)"></path><path d="M0,0 Q15,0 20,50 Q25,99 50,99 L50,101 Q25,101 20,150 Q15,200 0,200 Z" fill="hsl(0,0%,30%)" transform="scale(-1.0,1.0)"></path></g></g><g data-name="bottom-sheet" transform="scale(0.1,1.0)scale(-0.5,0.5)translate(0.0,150.0)"><g transform="scale(1.0,0.75)"><path d="M0,0 Q15,0 20,50 Q25,99 50,99 L50,101 Q25,101 20,150 Q15,200 0,200 Z" fill="hsl(0,0%,70%)"></path><path d="M0,0 Q15,0 20,50 Q25,99 50,99 L50,101 Q25,101 20,150 Q15,200 0,200 Z" fill="hsl(0,0%,30%)" transform="scale(-1.0,1.0)"></path></g></g><path d="M0,0 L0,150" stroke-width="1" stroke="black"></path></g><g data-name="payload-launch"><g transform="translate(0.0,37.5)"><g><path d="M3,0 L46,0" stroke="steelblue"></path><path d="M45,-1 L47,0 L45,1 Z" fill="steelblue"></path><rect fill="black" height="2" width="2" x="48" y="-1"></rect></g></g><g transform="translate(0.0,112.5)"><g><path d="M3,0 L46,0" stroke="steelblue"></path><path d="M45,-1 L47,0 L45,1 Z" fill="steelblue"></path><rect fill="black" height="2" width="2" x="48" y="-1"></rect></g></g></g><g data-name="spin-indicator-front" transform="translate(0.0,75.0)"><g><path d="M-8,0 A8,2.6666667 0 0 0 8,0" data-name="spin-indicator-line" fill="none" stroke="red"></path><g data-name="spin-indicator-arrows"><path d="M3,0 L-1.875,-2 L-3,0 Z" data-name="spin-indicator-arrow" fill="red" transform="translate(8.0,0.0)"></path><path d="M3,0 L-1.875,-2 L-3,0 Z" data-name="spin-indicator-arrow" fill="red" transform="rotate(180.0)translate(8.0,0.0)"></path></g></g></g></g></svg><figcaption>Payload is launched after pulling in the extended sheet.</figcaption></figure>
<p>Retracted, the sheet no longer experiences solar pressure and spins faster and faster to the point it destroys itself. But it does continue to spin. To slow it down, we can unfurl the second sheet, which immediately reverts the spin to the slower rotation the assembly had before the first sheet was drawn in. Also, since the second sheet has swapped which side is reflective, solar pressure on the second sheet begins to counteract the spin of the whole assembly and slow rotation.</p>
<figure class="figure-small"><svg viewBox="0 0 100 150" width="100%"><rect width="100%" height="100%" fill="white"></rect><g transform="translate(50.0,0.0)"><g data-name="spin-indicator-back" transform="translate(0.0,75.0)"><path d="M15,0 A15,5.0 0 0 0 -15,0" data-name="spin-indicator-line" fill="none" stroke="red"></path><path d="M30,0 A30,10.0 0 0 0 -30,0" data-name="spin-indicator-line" fill="none" stroke-width="0.5" stroke="red"></path></g><g><g data-name="top-sheet" transform="scale(0.1,1.0)scale(0.5,0.5)"><g transform="scale(1.0,0.75)"><path d="M0,0 Q15,0 20,50 Q25,99 50,99 L50,101 Q25,101 20,150 Q15,200 0,200 Z" fill="hsl(0,0%,70%)"></path><path d="M0,0 Q15,0 20,50 Q25,99 50,99 L50,101 Q25,101 20,150 Q15,200 0,200 Z" fill="hsl(0,0%,30%)" transform="scale(-1.0,1.0)"></path></g></g><g data-name="bottom-sheet" transform="scale(-0.5,0.5)translate(0.0,150.0)"><g transform="scale(1.0,0.75)"><path d="M0,0 Q15,0 20,50 Q25,99 50,99 L50,101 Q25,101 20,150 Q15,200 0,200 Z" fill="hsl(0,0%,70%)"></path><path d="M0,0 Q15,0 20,50 Q25,99 50,99 L50,101 Q25,101 20,150 Q15,200 0,200 Z" fill="hsl(0,0%,30%)" transform="scale(-1.0,1.0)"></path></g></g><path d="M0,0 L0,150" stroke-width="1" stroke="black"></path></g><g data-name="payload-launch" style="display: none"><g transform="translate(0.0,37.5)"><g><path d="M3,0 L46,0" stroke="steelblue"></path><path d="M45,-1 L47,0 L45,1 Z" fill="steelblue"></path><rect fill="black" height="2" width="2" x="48" y="-1"></rect></g></g><g transform="translate(0.0,112.5)"><g><path d="M3,0 L46,0" stroke="steelblue"></path><path d="M45,-1 L47,0 L45,1 Z" fill="steelblue"></path><rect fill="black" height="2" width="2" x="48" y="-1"></rect></g></g></g><g data-name="spin-indicator-front" transform="translate(0.0,75.0)"><g><path d="M-15,0 A15,5.0 0 0 0 15,0" data-name="spin-indicator-line" fill="none" stroke="red"></path><g data-name="spin-indicator-arrows"><path d="M3,0 L-1.0,-2 L-3,0 Z" data-name="spin-indicator-arrow" fill="red" transform="translate(15.0,0.0)"></path><path d="M3,0 L-1.0,-2 L-3,0 Z" data-name="spin-indicator-arrow" fill="red" transform="rotate(180.0)translate(15.0,0.0)"></path></g></g><g><path d="M-30,0 A30,10.0 0 0 0 30,0" data-name="spin-indicator-line" fill="none" stroke-width="0.5" stroke="red"></path><g data-name="spin-indicator-arrows" transform="scale(-1.0,1.0)"><path d="M3,0 L-0.5,-2 L-3,0 Z" data-name="spin-indicator-arrow" fill="red" transform="translate(30.0,0.0)scale(0.75,0.75)"></path><path d="M3,0 L-0.5,-2 L-3,0 Z" data-name="spin-indicator-arrow" fill="red" transform="rotate(180.0)translate(30.0,0.0)scale(0.75,0.75)"></path></g></g></g></g></svg><figcaption>The second sheet can be used decelerate spin.</figcaption></figure>
<p>Once the assembly stops rotating, new payloads can be installed and the whole assembly spun up again to repeat the process.</p><p>The weakest point of this setup is likely the rod connecting the two sheets, which would have to be strong enough to withstand the twisting forces caused by the changes in angular momentum when sheets are pulled sheets in and let. The force of the counteracting spin, though, should be minor.</p><p>While this setup doesn't require a power source or electric motor to spin down the apparatus, it does require them to pull in the sheets.</p><p>If you have thoughts on this idea, please <a href="mailto:blog@exupero.org?subject=Double TARS">email me</a>.</p>
]]></content>
  </entry>
  <entry>
    <id>https://blog.exupero.org/tars-and-angular-momentum</id>
    <link href="https://blog.exupero.org/tars-and-angular-momentum"/>
    <title>TARS and angular momentum</title>
    <updated>2025-08-14T08:00:00+00:00</updated>
    <content type="html"><![CDATA[<p>The paper "<a href='https://arxiv.org/abs/2507.17615'>Torqued Accelarator using Radiation from the Sun (TARS) for Interstellar Payloads</a>" has been making the rounds, possibly in part because of how approachable the idea is. In short, it proposes deploying a large sheet in orbit of the sun, with one half of each side coated to reflect sunlight and the other half to absorb it, creating asymmetic forces that would cause the sheet to spin faster and faster. Eventually the sheet would spin fast enough to tear itself apart, but before that it could release a small payload from one end, slinging it out of the solar system. With existing materials, it could spin up to an edge speed of around 10 km/s. <a href='https://www.centauri-dreams.org/2025/08/05/a-rotating-probe-launcher-alternative-to-tars/'>This post</a> at <a href='https://www.centauri-dreams.org/'>Centauri Dreams</a> proposes some alterations and alternatives to the concept, which involve more moving parts but also more control. Considering those ideas suggested one more to me: taking advantage of the conservation of angular momentum.</p><p><a href='https://www.youtube.com/watch?v=MDM1COWJ2Hc'>This video</a> by the paper's author includes <a href='https://youtu.be/MDM1COWJ2Hc?si=ci3RfQ2l5RGKwYxy&t=1275'>this animation</a> of a TARS sheet unfolding in space and spinning up. Once it's spun up, reversing the unfolding process and folding the sheet back up would reduce the object's radius and thus increase its speed (usually demonstrated by a figure skater pulling their arms in to spin faster). One question, however, is whether that increase in speed is an increase in linear edge speed, or only in rotational speed.</p><p>In the example of a figure skater, rotational speed clearly increases, but does it increase only enough to maintain the same linear speed at the edge, spinning faster because an object on the edge is now traversing a smaller circumference? <a href='https://en.wikipedia.org/wiki/Angular_momentum#Orbital_angular_momentum_in_two_dimensions'>Wikipedia shows</a> that for a point mass, angular momentum <i>L</i> is</p>
<div class="formula"><svg xmlns:xlink="http://www.w3.org/1999/xlink" width="8.898ex" height="2.176ex" style="vertical-align: -0.338ex;" viewBox="0 -791.3 3831.1 936.9" role="img" focusable="false" xmlns="http://www.w3.org/2000/svg" aria-labelledby="MathJax-SVG-1-Title">
<title id="MathJax-SVG-1-Title">upper L equals m r v</title>
<defs aria-hidden="true">
<path stroke-width="1" id="E1-MJMATHI-4C" d="M228 637Q194 637 192 641Q191 643 191 649Q191 673 202 682Q204 683 217 683Q271 680 344 680Q485 680 506 683H518Q524 677 524 674T522 656Q517 641 513 637H475Q406 636 394 628Q387 624 380 600T313 336Q297 271 279 198T252 88L243 52Q243 48 252 48T311 46H328Q360 46 379 47T428 54T478 72T522 106T564 161Q580 191 594 228T611 270Q616 273 628 273H641Q647 264 647 262T627 203T583 83T557 9Q555 4 553 3T537 0T494 -1Q483 -1 418 -1T294 0H116Q32 0 32 10Q32 17 34 24Q39 43 44 45Q48 46 59 46H65Q92 46 125 49Q139 52 144 61Q147 65 216 339T285 628Q285 635 228 637Z"></path>
<path stroke-width="1" id="E1-MJMAIN-3D" d="M56 347Q56 360 70 367H707Q722 359 722 347Q722 336 708 328L390 327H72Q56 332 56 347ZM56 153Q56 168 72 173H708Q722 163 722 153Q722 140 707 133H70Q56 140 56 153Z"></path>
<path stroke-width="1" id="E1-MJMATHI-6D" d="M21 287Q22 293 24 303T36 341T56 388T88 425T132 442T175 435T205 417T221 395T229 376L231 369Q231 367 232 367L243 378Q303 442 384 442Q401 442 415 440T441 433T460 423T475 411T485 398T493 385T497 373T500 364T502 357L510 367Q573 442 659 442Q713 442 746 415T780 336Q780 285 742 178T704 50Q705 36 709 31T724 26Q752 26 776 56T815 138Q818 149 821 151T837 153Q857 153 857 145Q857 144 853 130Q845 101 831 73T785 17T716 -10Q669 -10 648 17T627 73Q627 92 663 193T700 345Q700 404 656 404H651Q565 404 506 303L499 291L466 157Q433 26 428 16Q415 -11 385 -11Q372 -11 364 -4T353 8T350 18Q350 29 384 161L420 307Q423 322 423 345Q423 404 379 404H374Q288 404 229 303L222 291L189 157Q156 26 151 16Q138 -11 108 -11Q95 -11 87 -5T76 7T74 17Q74 30 112 181Q151 335 151 342Q154 357 154 369Q154 405 129 405Q107 405 92 377T69 316T57 280Q55 278 41 278H27Q21 284 21 287Z"></path>
<path stroke-width="1" id="E1-MJMATHI-72" d="M21 287Q22 290 23 295T28 317T38 348T53 381T73 411T99 433T132 442Q161 442 183 430T214 408T225 388Q227 382 228 382T236 389Q284 441 347 441H350Q398 441 422 400Q430 381 430 363Q430 333 417 315T391 292T366 288Q346 288 334 299T322 328Q322 376 378 392Q356 405 342 405Q286 405 239 331Q229 315 224 298T190 165Q156 25 151 16Q138 -11 108 -11Q95 -11 87 -5T76 7T74 17Q74 30 114 189T154 366Q154 405 128 405Q107 405 92 377T68 316T57 280Q55 278 41 278H27Q21 284 21 287Z"></path>
<path stroke-width="1" id="E1-MJMATHI-76" d="M173 380Q173 405 154 405Q130 405 104 376T61 287Q60 286 59 284T58 281T56 279T53 278T49 278T41 278H27Q21 284 21 287Q21 294 29 316T53 368T97 419T160 441Q202 441 225 417T249 361Q249 344 246 335Q246 329 231 291T200 202T182 113Q182 86 187 69Q200 26 250 26Q287 26 319 60T369 139T398 222T409 277Q409 300 401 317T383 343T365 361T357 383Q357 405 376 424T417 443Q436 443 451 425T467 367Q467 340 455 284T418 159T347 40T241 -11Q177 -11 139 22Q102 54 102 117Q102 148 110 181T151 298Q173 362 173 380Z"></path>
</defs>
<g stroke="currentColor" fill="currentColor" stroke-width="0" transform="matrix(1 0 0 -1 0 0)" aria-hidden="true">
 <use xlink:href="#E1-MJMATHI-4C" x="0" y="0"></use>
 <use xlink:href="#E1-MJMAIN-3D" x="959" y="0"></use>
 <use xlink:href="#E1-MJMATHI-6D" x="2015" y="0"></use>
 <use xlink:href="#E1-MJMATHI-72" x="2894" y="0"></use>
 <use xlink:href="#E1-MJMATHI-76" x="3345" y="0"></use>
</g>
</svg>
</div>
<p>With constant angular momentum but two different radii, we have</p>
<div class="formula"><svg xmlns:xlink="http://www.w3.org/1999/xlink" width="21.182ex" height="5.843ex" style="vertical-align: -2.338ex;" viewBox="0 -1508.9 9119.8 2515.6" role="img" focusable="false" xmlns="http://www.w3.org/2000/svg" aria-labelledby="MathJax-SVG-1-Title">
<title id="MathJax-SVG-1-Title">StartLayout 1st Row  upper L equals m r 1 v 1 equals m r 2 v 2 2nd Row  r 1 v 1 equals r 2 v 2 EndLayout</title>
<defs aria-hidden="true">
<path stroke-width="1" id="E1-MJMATHI-4C" d="M228 637Q194 637 192 641Q191 643 191 649Q191 673 202 682Q204 683 217 683Q271 680 344 680Q485 680 506 683H518Q524 677 524 674T522 656Q517 641 513 637H475Q406 636 394 628Q387 624 380 600T313 336Q297 271 279 198T252 88L243 52Q243 48 252 48T311 46H328Q360 46 379 47T428 54T478 72T522 106T564 161Q580 191 594 228T611 270Q616 273 628 273H641Q647 264 647 262T627 203T583 83T557 9Q555 4 553 3T537 0T494 -1Q483 -1 418 -1T294 0H116Q32 0 32 10Q32 17 34 24Q39 43 44 45Q48 46 59 46H65Q92 46 125 49Q139 52 144 61Q147 65 216 339T285 628Q285 635 228 637Z"></path>
<path stroke-width="1" id="E1-MJMAIN-3D" d="M56 347Q56 360 70 367H707Q722 359 722 347Q722 336 708 328L390 327H72Q56 332 56 347ZM56 153Q56 168 72 173H708Q722 163 722 153Q722 140 707 133H70Q56 140 56 153Z"></path>
<path stroke-width="1" id="E1-MJMATHI-6D" d="M21 287Q22 293 24 303T36 341T56 388T88 425T132 442T175 435T205 417T221 395T229 376L231 369Q231 367 232 367L243 378Q303 442 384 442Q401 442 415 440T441 433T460 423T475 411T485 398T493 385T497 373T500 364T502 357L510 367Q573 442 659 442Q713 442 746 415T780 336Q780 285 742 178T704 50Q705 36 709 31T724 26Q752 26 776 56T815 138Q818 149 821 151T837 153Q857 153 857 145Q857 144 853 130Q845 101 831 73T785 17T716 -10Q669 -10 648 17T627 73Q627 92 663 193T700 345Q700 404 656 404H651Q565 404 506 303L499 291L466 157Q433 26 428 16Q415 -11 385 -11Q372 -11 364 -4T353 8T350 18Q350 29 384 161L420 307Q423 322 423 345Q423 404 379 404H374Q288 404 229 303L222 291L189 157Q156 26 151 16Q138 -11 108 -11Q95 -11 87 -5T76 7T74 17Q74 30 112 181Q151 335 151 342Q154 357 154 369Q154 405 129 405Q107 405 92 377T69 316T57 280Q55 278 41 278H27Q21 284 21 287Z"></path>
<path stroke-width="1" id="E1-MJMATHI-72" d="M21 287Q22 290 23 295T28 317T38 348T53 381T73 411T99 433T132 442Q161 442 183 430T214 408T225 388Q227 382 228 382T236 389Q284 441 347 441H350Q398 441 422 400Q430 381 430 363Q430 333 417 315T391 292T366 288Q346 288 334 299T322 328Q322 376 378 392Q356 405 342 405Q286 405 239 331Q229 315 224 298T190 165Q156 25 151 16Q138 -11 108 -11Q95 -11 87 -5T76 7T74 17Q74 30 114 189T154 366Q154 405 128 405Q107 405 92 377T68 316T57 280Q55 278 41 278H27Q21 284 21 287Z"></path>
<path stroke-width="1" id="E1-MJMAIN-31" d="M213 578L200 573Q186 568 160 563T102 556H83V602H102Q149 604 189 617T245 641T273 663Q275 666 285 666Q294 666 302 660V361L303 61Q310 54 315 52T339 48T401 46H427V0H416Q395 3 257 3Q121 3 100 0H88V46H114Q136 46 152 46T177 47T193 50T201 52T207 57T213 61V578Z"></path>
<path stroke-width="1" id="E1-MJMATHI-76" d="M173 380Q173 405 154 405Q130 405 104 376T61 287Q60 286 59 284T58 281T56 279T53 278T49 278T41 278H27Q21 284 21 287Q21 294 29 316T53 368T97 419T160 441Q202 441 225 417T249 361Q249 344 246 335Q246 329 231 291T200 202T182 113Q182 86 187 69Q200 26 250 26Q287 26 319 60T369 139T398 222T409 277Q409 300 401 317T383 343T365 361T357 383Q357 405 376 424T417 443Q436 443 451 425T467 367Q467 340 455 284T418 159T347 40T241 -11Q177 -11 139 22Q102 54 102 117Q102 148 110 181T151 298Q173 362 173 380Z"></path>
<path stroke-width="1" id="E1-MJMAIN-32" d="M109 429Q82 429 66 447T50 491Q50 562 103 614T235 666Q326 666 387 610T449 465Q449 422 429 383T381 315T301 241Q265 210 201 149L142 93L218 92Q375 92 385 97Q392 99 409 186V189H449V186Q448 183 436 95T421 3V0H50V19V31Q50 38 56 46T86 81Q115 113 136 137Q145 147 170 174T204 211T233 244T261 278T284 308T305 340T320 369T333 401T340 431T343 464Q343 527 309 573T212 619Q179 619 154 602T119 569T109 550Q109 549 114 549Q132 549 151 535T170 489Q170 464 154 447T109 429Z"></path>
</defs>
<g stroke="currentColor" fill="currentColor" stroke-width="0" transform="matrix(1 0 0 -1 0 0)" aria-hidden="true">
<g transform="translate(167,0)">
<g transform="translate(-11,0)">
<g transform="translate(0,600)">
 <use xlink:href="#E1-MJMATHI-4C" x="0" y="0"></use>
 <use xlink:href="#E1-MJMAIN-3D" x="959" y="0"></use>
 <use xlink:href="#E1-MJMATHI-6D" x="2015" y="0"></use>
<g transform="translate(2894,0)">
 <use xlink:href="#E1-MJMATHI-72" x="0" y="0"></use>
 <use transform="scale(0.707)" xlink:href="#E1-MJMAIN-31" x="638" y="-213"></use>
</g>
<g transform="translate(3799,0)">
 <use xlink:href="#E1-MJMATHI-76" x="0" y="0"></use>
 <use transform="scale(0.707)" xlink:href="#E1-MJMAIN-31" x="686" y="-213"></use>
</g>
 <use xlink:href="#E1-MJMAIN-3D" x="5016" y="0"></use>
 <use xlink:href="#E1-MJMATHI-6D" x="6072" y="0"></use>
<g transform="translate(6951,0)">
 <use xlink:href="#E1-MJMATHI-72" x="0" y="0"></use>
 <use transform="scale(0.707)" xlink:href="#E1-MJMAIN-32" x="638" y="-213"></use>
</g>
<g transform="translate(7856,0)">
 <use xlink:href="#E1-MJMATHI-76" x="0" y="0"></use>
 <use transform="scale(0.707)" xlink:href="#E1-MJMAIN-32" x="686" y="-213"></use>
</g>
</g>
<g transform="translate(1886,-700)">
 <use xlink:href="#E1-MJMATHI-72" x="0" y="0"></use>
 <use transform="scale(0.707)" xlink:href="#E1-MJMAIN-31" x="638" y="-213"></use>
<g transform="translate(905,0)">
 <use xlink:href="#E1-MJMATHI-76" x="0" y="0"></use>
 <use transform="scale(0.707)" xlink:href="#E1-MJMAIN-31" x="686" y="-213"></use>
</g>
 <use xlink:href="#E1-MJMAIN-3D" x="2122" y="0"></use>
<g transform="translate(3178,0)">
 <use xlink:href="#E1-MJMATHI-72" x="0" y="0"></use>
 <use transform="scale(0.707)" xlink:href="#E1-MJMAIN-32" x="638" y="-213"></use>
</g>
<g transform="translate(4084,0)">
 <use xlink:href="#E1-MJMATHI-76" x="0" y="0"></use>
 <use transform="scale(0.707)" xlink:href="#E1-MJMAIN-32" x="686" y="-213"></use>
</g>
</g>
</g>
</g>
</g>
</svg>
</div>
<p>So radius and linear edge speed are inversely proportional, and drawing a point mass toward its center of motion would increase its edge speed. For TARS, this means that operators could increase the launch speed of a payload by re-folding the sheet back toward its center before releasing the payload. But that may not be viable in practice. Payloads would be released at the maximum speed allowed by the sheet's material, and pulling the sheet in and increasing rotational velocity would only increase stresses. Possibly the sheet could be pulled in by a material stronger than the sheet itself. Even without such a material, though, I can see two advantages to pulling in the sheet.</p><p>The first is that the sheet does not need to wait as long to spin up to its maximum launch speed. Solar pressure only needs to spin the sheet up to a fraction of that speed, and drawing in the sheet can increase the spin to the material's limits. When spin-up times are measured in years due to the relative weakness of solar pressure, being able to reach max speed in a fraction of that time makes a meaningful difference.</p><p>The second advantage of drawing the sheet in is that, once refolded, it would no longer have a surface to be acted on by solar pressure, stopping acceleration and preserving the sheet. Electric motors may be able to counter rotation, slowly spinning down the sheet to a speed at which new payloads can be installed. That would turn a TARS sheet from an expendable launch vehicle into a reusable one.</p><p>One caveat to all this is the moment of inertia of a TARS sheet. Radius and edge speed are only inversely proportional with a point mass spinning around a center, but the video shows a TARS sheet with a mass concentrated much closer to the axis of rotation. Drawing in such a sheet may not make that much of difference in edge speed, though it should still preserve the sheet.</p><p>If you have thoughts, I'm <a href="mailto:blog@exupero.org?subject=TARS and angular momentum">happy to hear them</a>.</p>
]]></content>
  </entry>
</feed>
