// Simple numbering for non-book documents #let equation-numbering = "(1)" #let callout-numbering = "1" #let subfloat-numbering(n-super, subfloat-idx) = { numbering("1a", n-super, subfloat-idx) } // Theorem configuration for theorion // Simple numbering for non-book documents (no heading inheritance) #let theorem-inherited-levels = 0 // Theorem numbering format (can be overridden by extensions for appendix support) // This function returns the numbering pattern to use #let theorem-numbering(loc) = "1.1" // Default theorem render function #let theorem-render(prefix: none, title: "", full-title: auto, body) = { if full-title != "" and full-title != auto and full-title != none { strong[#full-title.] h(0.5em) } body } // Some definitions presupposed by pandoc's typst output. #let content-to-string(content) = { if content.has("text") { content.text } else if content.has("children") { content.children.map(content-to-string).join("") } else if content.has("body") { content-to-string(content.body) } else if content == [ ] { " " } } #let horizontalrule = line(start: (25%,0%), end: (75%,0%)) #let endnote(num, contents) = [ #stack(dir: ltr, spacing: 3pt, super[#num], contents) ] #show terms.item: it => block(breakable: false)[ #text(weight: "bold")[#it.term] #block(inset: (left: 1.5em, top: -0.4em))[#it.description] ] // Some quarto-specific definitions. #show raw.where(block: true): set block( fill: luma(230), width: 100%, inset: 8pt, radius: 2pt ) #let block_with_new_content(old_block, new_content) = { let fields = old_block.fields() let _ = fields.remove("body") if fields.at("below", default: none) != none { // TODO: this is a hack because below is a "synthesized element" // according to the experts in the typst discord... fields.below = fields.below.abs } block.with(..fields)(new_content) } #let empty(v) = { if type(v) == str { // two dollar signs here because we're technically inside // a Pandoc template :grimace: v.matches(regex("^\\s*$")).at(0, default: none) != none } else if type(v) == content { if v.at("text", default: none) != none { return empty(v.text) } for child in v.at("children", default: ()) { if not empty(child) { return false } } return true } } // Subfloats // This is a technique that we adapted from https://github.com/tingerrr/subpar/ #let quartosubfloatcounter = counter("quartosubfloatcounter") #let quarto_super( kind: str, caption: none, label: none, supplement: str, position: none, subcapnumbering: "(a)", body, ) = { context { let figcounter = counter(figure.where(kind: kind)) let n-super = figcounter.get().first() + 1 set figure.caption(position: position) [#figure( kind: kind, supplement: supplement, caption: caption, { show figure.where(kind: kind): set figure(numbering: _ => { let subfloat-idx = quartosubfloatcounter.get().first() + 1 subfloat-numbering(n-super, subfloat-idx) }) show figure.where(kind: kind): set figure.caption(position: position) show figure: it => { let num = numbering(subcapnumbering, n-super, quartosubfloatcounter.get().first() + 1) show figure.caption: it => block({ num.slice(2) // I don't understand why the numbering contains output that it really shouldn't, but this fixes it shrug? [ ] it.body }) quartosubfloatcounter.step() it counter(figure.where(kind: it.kind)).update(n => n - 1) } quartosubfloatcounter.update(0) body } )#label] } } // callout rendering // this is a figure show rule because callouts are crossreferenceable #show figure: it => { if type(it.kind) != str { return it } let kind_match = it.kind.matches(regex("^quarto-callout-(.*)")).at(0, default: none) if kind_match == none { return it } let kind = kind_match.captures.at(0, default: "other") kind = upper(kind.first()) + kind.slice(1) // now we pull apart the callout and reassemble it with the crossref name and counter // when we cleanup pandoc's emitted code to avoid spaces this will have to change let old_callout = it.body.children.at(1).body.children.at(1) let old_title_block = old_callout.body.children.at(0) let children = old_title_block.body.body.children let old_title = if children.len() == 1 { children.at(0) // no icon: title at index 0 } else { children.at(1) // with icon: title at index 1 } // TODO use custom separator if available // Use the figure's counter display which handles chapter-based numbering // (when numbering is a function that includes the heading counter) let callout_num = it.counter.display(it.numbering) let new_title = if empty(old_title) { [#kind #callout_num] } else { [#kind #callout_num: #old_title] } let new_title_block = block_with_new_content( old_title_block, block_with_new_content( old_title_block.body, if children.len() == 1 { new_title // no icon: just the title } else { children.at(0) + new_title // with icon: preserve icon block + new title })) align(left, block_with_new_content(old_callout, block(below: 0pt, new_title_block) + old_callout.body.children.at(1))) } // 2023-10-09: #fa-icon("fa-info") is not working, so we'll eval "#fa-info()" instead #let callout(body: [], title: "Callout", background_color: rgb("#dddddd"), icon: none, icon_color: black, body_background_color: white) = { block( breakable: false, fill: background_color, stroke: (paint: icon_color, thickness: 0.5pt, cap: "round"), width: 100%, radius: 2pt, block( inset: 1pt, width: 100%, below: 0pt, block( fill: background_color, width: 100%, inset: 8pt)[#if icon != none [#text(icon_color, weight: 900)[#icon] ]#title]) + if(body != []){ block( inset: 1pt, width: 100%, block(fill: body_background_color, width: 100%, inset: 8pt, body)) } ) } // arxivai — Quarto Typst template partial. // Replaces Quarto's default `article()` with the arxivai preprint layout. // Both packages are importable from raw ```{=typst}``` blocks in the body: // #arxivai.operation-box(...) #arxivai.app-figure(...) #lettreai.badge(...) #import "lettreai.typ" as lettreai #import "arxivai.typ" as arxivai // --------------------------------------------------------------------------- // Re-theme Quarto's automatic callouts (same contract as lettreai: block // nesting kept structurally identical to Quarto's default so the crossref // figure show rule in definitions.typ keeps working). // --------------------------------------------------------------------------- #let callout( body: [], title: "Callout", background_color: rgb("#dddddd"), icon: none, icon_color: black, body_background_color: white, ) = { let accent = if icon_color == black { lettreai.colors.oxford-blue } else { icon_color } block( breakable: false, fill: lettreai.tint(accent, 0.94), stroke: (left: 3pt + accent, rest: 0.5pt + lettreai.tint(accent, 0.5)), width: 100%, radius: 3pt, block( inset: 1pt, width: 100%, below: 0pt, block( fill: lettreai.tint(accent, 0.84), width: 100%, inset: 8pt, )[#if icon != none [#text(accent, weight: 900)[#icon] ]#text(fill: lettreai.shade(accent, 0.25), weight: 700)[#title]]) + if (body != []) { block( inset: 1pt, width: 100%, block(fill: body_background_color, width: 100%, inset: 8pt, body)) } ) } // --------------------------------------------------------------------------- // arXiv preprint article — same signature contract as Quarto's default, // extended with keywords and running-title. // --------------------------------------------------------------------------- #let article( title: none, subtitle: none, authors: none, keywords: (), running-title: none, book: false, date: none, abstract-title: none, abstract: none, thanks: none, cols: 1, lang: "en", region: "US", font: none, fontsize: 10.5pt, title-size: 1.7em, subtitle-size: 1.15em, heading-family: none, heading-weight: "bold", heading-style: "normal", heading-color: black, heading-line-height: 0.65em, mathfont: none, codefont: none, linestretch: 1, sectionnumbering: none, linkcolor: none, citecolor: none, filecolor: none, toc: false, toc_title: none, toc_depth: none, toc_indent: 1.5em, doc, ) = { // PDF metadata. set document(title: title) set document( author: authors.map(a => lettreai.to-string(a.name)).join(", ", last: " & "), ) if authors != none and authors != () set document( keywords: keywords.map(k => lettreai.to-string(k)), ) if keywords != none and keywords != () set par(justify: true, leading: linestretch * 0.65em) set text(lang: lang, region: region, size: fontsize) show math.equation: set text(font: mathfont) if mathfont != none set heading(numbering: sectionnumbering) // Running header + footer; book mode gets chapter-aware heads and the // O'Reilly outer-margin geometry. let rt = if running-title != none { running-title } else if title != none { title } else { [] } set page( header: if book { arxivai.book-header() } else { arxivai.arxiv-header(rt) }, footer: if book { arxivai.book-footer() } else { arxivai.arxiv-footer() }, ) set page(margin: arxivai.book-margin) if book // Resolve fonts: explicit Quarto fonts win, else theme defaults. let resolved-font = if font != none { font } else { lettreai.body-font } let resolved-code = if codefont != none { codefont } else { lettreai.mono-font } let resolved-heading-color = if heading-color != black { heading-color } else { lettreai.colors.oxford-blue } let resolved-link = if linkcolor != none { rgb(lettreai.to-string(linkcolor)) } else { lettreai.colors.oxford-blue } // Paint everything with the shared theme, then the figure rules. show: lettreai.theme-rules.with( fonts: resolved-font, code-font: resolved-code, heading-color: resolved-heading-color, link-color: resolved-link, ) show: arxivai.arxiv-figure-rules // Book chapter rule is the innermost show, so it transforms level-1 // headings FIRST (inner rules apply first), replacing them with chapter // openers before the theme's h1 rule could wrap them in a container. // Synthetic non-outlined headings (e.g. the outline's own title) are // excluded inside book-heading-rules. show: doc2 => if book { arxivai.book-heading-rules(doc2) } else { doc2 } show ref: set text(fill: rgb(lettreai.to-string(citecolor))) if citecolor != none // Preprint front matter. arxivai.arxiv-title-block( title: title, subtitle: subtitle, authors: authors, date: date, ) if abstract != none { arxivai.arxiv-abstract( abstract, abstract-title: if abstract-title == none { [Abstract] } else { abstract-title }, ) } arxivai.arxiv-keywords(keywords) // Book mode: the front matter is a title page of its own. if book { pagebreak(weak: true) } // Optional table of contents (its own page in book mode). if toc { block(above: 0.5em, below: 2em, lettreai.lettreai-outline( title: if toc_title == none { auto } else { toc_title }, depth: toc_depth, indent: toc_indent, )) if book { pagebreak(weak: true) } } if cols > 1 { columns(cols, doc) } else { doc } } #import "@preview/fontawesome:0.5.0": * #let brand-color = (:) #let brand-color-background = (:) #let brand-logo = (:) #set page( paper: "a4", margin: (x: 2.4cm,y: 2.6cm,), numbering: "1", columns: 1, ) #show: doc => article( title: [Construction Geometry of the Conic Sundial with Horizontal Gnomon], subtitle: [An Analytical Framework for Shadow Projection and Apex-Free Parameter Recovery on an Inclined Cone], authors: ( ( name: [Gerd Graßhoff], affiliation: [Humboldt-Universität zu Berlin, Deutsches Museum], email: [gerd.grasshoff\@hu-berlin.de], orcid: [0000-0002-4450-357X] ), ), keywords: ([conic sundial],[gnomonics],[shadow geometry],[klimata],[ancient instruments],[analytical inversion],[apex-free reconstruction],), running-title: [Conic Sundial Geometry], abstract: [A conic sundial with its nodus on the polar axis is determined by three construction choices: the intended latitude (the #emph[klima] proportion of the ancient shadow-table tradition), the cone opening, and an arbitrary scale. Because the nodus is mounted directly on the celestial rotation axis, every fixed solar declination projects a circular shadow path onto the interior cone surface, perpendicular to that axis. This paper establishes the complete analytical geometry of that instrument in a unified East--North--Up world frame and derives its exact closed-form inversion. The central theoretical result is that the three seasonal meridian marks ($P_S\,P_E\,P_W$) determine the cone --- half-angle $alpha$, scale $d$, and apex position $A$ --- independently of geographical latitude $phi$. Latitude is not encoded in the relative positions of the noon marks; it enters the artifact exclusively through the hour division of the solstitial day-lines and the dressing of the block faces. A closed-form marking ratio $Q =\(L_S - L_W\)\/\(L_S - L_E\)$ recovers $alpha$ and the apex even when the vertex is chipped or missing. The mathematical framework is verified against an exact synthetic Rhodes construction and compared with measured artifacts from the Berlin Sundial Project corpus. ], abstract-title: "Abstract", font: ("Source Sans 3",), sectionnumbering: "1.1", toc: true, toc_title: [Table of contents], toc_depth: 3, doc, ) #block[ #callout( body: [ Supplement S2 to the Ancient Sundials repository (Berlin Sundial Collaboration, ancient-sundials.lettre.ai). This draft documents the shadow animation and the astronomical picture of each object (noon altitude, day length). It is a preprint draft and has not been peer reviewed. Where a figure in the repository differs from a figure here, the repository, which is rebuilt from the current database, is authoritative. ] , title: [ Supplement S2 ] , background_color: rgb("#dae6fb") , icon_color: rgb("#0758E5") , icon: fa-info() , body_background_color: white ) ] = Introduction: The Geometry of Ancient Timekeeping Ancient Greek and Roman horology produced three principal types of spherical and conical shadow-receiving dials @gibbs1976@schaldach2006. Among these, the conical sundial with a horizontal gnomon occupies a privileged mathematical position. Unlike planar sundials, where seasonal shadow paths are hyperbolae or ellipses varying in curvature across the year, the conic dial with a nodus on the polar axis projects every seasonal day-curve as an exact circular arc. When archaeologists excavate a fragmentary sundial in the Mediterranean basin, the stone is frequently damaged: the apex of the hollowed cone is chipped, the gnomon has perished, and the original orientation on its pedestal is lost. The computational task is to recover the intended construction parameters from the 3D scan of the surviving stone fragment. #arxivai.concept-box(title: [The central thesis in one sentence])[ The three seasonal noon marks on a conic sundial determine the cone half-angle and the nodus distance completely and independently of latitude; the latitude $phi$ is not recorded in the noon marks and must be recovered from the hour-line network or from the dressed reference planes of the block. ] This thesis directly corrects an assumption in the literature that treats the solstitial noon-mark ratio as a latitude diagnostic. On a cone whose axis is aligned with the celestial pole, rotational symmetry uncouples the axial spacing of the seasonal day-lines from the tilt of the cone axis above the horizon. The noon marks record the shape of the cone; the hour network records the latitude. Five contributions establish this framework: + #strong[Forward Coordinate Geometry:] A rigorous formulation of shadow projection in an East--North--Up (ENU) world frame and an equatorial polar frame, yielding closed-form ray--cone intersections. + #strong[Day-Line Circularity:] A formal proof that all seasonal shadow traces are planar circles orthogonal to the cone axis, with the equinoctial circle sitting at an axial distance identical to the nodus distance ($d$). + #strong[Constructor's Proportion Vocabulary:] A complete formulation of the instrument's attributes in the proportional language of ancient dialmakers, governed by the workshop rule $x = tan alpha tan epsilon$. + #strong[Apex-Free Closed-Form Inversion:] The derivation of the marking ratio $Q$, which computes the cone half-angle $alpha$, the apex location $A$, and the scale $d$ directly from three collinear meridian marks without requiring the physical apex. + #strong[Marking Sufficiency & Sensitivity:] A comprehensive classification of which subsets of surface features determine which structural parameters, together with analytical error bounds. Direct physical evidence for this proportional design method comes from the unfinished conic sundial discovered on the Agora of the Italians on Delos @rinner2013delos. The Delos artifact demonstrates that ancient artisans committed the latitude proportion to the stone block before hollowing the cone, scribed reference transfer circles, and incised the noon line by simple geometric ratios. = Physical Construction Elements The geometry of the instrument is established by one fixed shadow-casting point and one receiving surface of revolution. #arxivai.concept-box(title: [The Nodus $N$])[ The shadow-casting point of the sundial: a small metallic sphere mounted on the Earth's polar axis, situated exactly on the observer's horizontal plane. All solar shadow rays originate geometrically from this point. ] #arxivai.concept-box(title: [The Cone, Apex $A$, and Half-Angle $alpha$])[ The receiving dialface is the interior nappe of a right circular cone. Its axis of rotational symmetry is collinear with the Earth's polar axis. The apex $A$ is positioned on this axis at a distance $d$ above the nodus, and the cone opens southward and downward with half-angle $alpha$. ] #arxivai.concept-box(title: [The Gnomon])[ A rigid horizontal support rod lying in the observer's meridian plane, extending northward from the nodus along the horizon to anchor into the stone block. Only the nodus, not the support rod, casts the time-telling shadow point. ] Because the nodus $N$ lies on the horizontal plane ($Z = 0$), the nodus shadow first strikes the receiving cone at the exact astronomical moment of sunrise, sweeps across the inscribed network during daylight, and leaves the cone at sunset. #ref(, supplement: [Figure]) illustrates the meridian cross-section of the instrument for a construction at Rhodes ($phi = 36^compose$, $alpha = 45^compose$). #figure([ #box(image("figures/fig-meridian.svg")) ], caption: figure.caption( position: bottom, [ Meridian cross-section of a conic sundial constructed for Rhodes ($phi = 36^compose$, $alpha = 45^compose$). View from the East (South is to the left, North to the right). The nodus $N$ rests on the horizon ($Z = 0$). The polar axis is inclined at angle $phi$. The cone apex $A$ lies on the polar axis at distance $d$ above $N$. The cone opens southward at half-angle $alpha$. Three noon rays passing through $N$ strike the lower meridian generator at $P_W$ (winter solstice), $P_E$ (equinox), and $P_S$ (summer solstice). ]), kind: "quarto-float-fig", supplement: "Figure", ) Three independent quantities fully determine the construction: + #strong[Latitude] $phi$ --- the celestial tilt of the polar axis above the horizon, fixed by the geographical location. + #strong[Nodus Distance] $d$ --- the distance along the polar axis from the apex $A$ to the nodus $N$. This is the constructor's arbitrary scale factor. + #strong[Cone Opening] $rho = tan alpha$ --- the ratio of rim radius to cone height, chosen by the artisan for aesthetic and structural reasons. The only physical constraint on the scale pair $\(d\,H\)$, where $H$ is the cone height along the axis, is that the nodus must sit inside the cone cavity: #math.equation(block: true, numbering: equation-numbering, [ $ d < H . $ ]) #emph[Reading.] The nodus distance $d$ along the axis must be strictly less than the total axial depth $H$ of the cone cavity, ensuring that shadows fall upon the interior stone surface throughout the year. = Coordinate Frames and Transformations To model the instrument unambiguously, we define two right-handed Cartesian coordinate systems. == The World Frame (ENU) The world coordinate frame is fixed to the local observer with the origin at the physical nodus $N$: - $+ X_w$ points #strong[East] (orthogonal to the meridian plane), - $+ Y_w$ points #strong[North] (along the horizontal meridian), - $+ Z_w$ points #strong[Up] (perpendicular to the local horizon). In this frame, the unit vector along the polar axis pointing toward the North Celestial Pole is: #math.equation(block: true, numbering: equation-numbering, [ $ hat(upright(bold(C))) =\(0\,med cos phi\,med sin phi\). $ ]) #emph[Reading.] The cone axis $hat(upright(bold(C)))$ has zero East--West component, a horizontal North component equal to $cos phi$, and a vertical Up component equal to $sin phi$, corresponding to an elevation angle of $phi$ above the northern horizon. The cone opens in the opposite direction, toward the South and downward: #math.equation(block: true, numbering: equation-numbering, [ $ hat(upright(bold(O))) = - hat(upright(bold(C))) =\(0\,med - cos phi\,med - sin phi\). $ ]) #emph[Reading.] The cone opening vector $hat(upright(bold(O)))$ points southward with component $- cos phi$ and downward with component $- sin phi$. == The Equatorial Polar Frame The polar coordinate frame has its $+ Z_p$ axis aligned with $hat(upright(bold(C)))$. The rotation matrix $R$ transforming coordinates from the polar frame to the world frame ($upright(bold(v))_w = R thin upright(bold(v))_p$) is uniquely determined by mapping the polar axis $\(0\,0\,1\)$ to $hat(upright(bold(C)))$ and mapping the equinoctial sunrise direction $\(- 1\,0\,0\)$ to the East vector $\(1\,0\,0\)$: #math.equation(block: true, numbering: equation-numbering, [ $ R = mat(delim: "(", - 1, 0, 0; 0, - sin phi, cos phi; 0, cos phi, sin phi) . $ ]) #emph[Reading.] The rotation matrix $R$ is an orthonormal transformation with determinant $+ 1$, mapping polar equatorial vectors into the local East--North--Up world coordinates. == The Mathematical Frame (Apex at Origin) For analytical derivations of ray--cone intersections, it is mathematically convenient to translate the origin to the cone apex $A$. In this mathematical frame: #math.equation(block: true, numbering: equation-numbering, [ $ A =\(0\,med 0\,med 0\)\,#h(2em) upright(bold(N)) = d thin hat(upright(bold(O))) =\(0\,med - d cos phi\,med - d sin phi\). $ ]) #emph[Reading.] In the mathematical frame, the cone apex $A$ is positioned at the coordinate origin, and the nodus $upright(bold(N))$ is located at distance $d$ along the opening direction $hat(upright(bold(O)))$. = Shadow Projection Algebra Let the Sun's position in the equatorial polar frame be defined by its solar declination $delta$ and hour angle $h$ (measured positive westward from the meridian, with $h = 0$ at solar noon): #math.equation(block: true, numbering: equation-numbering, [ $ hat(upright(bold(S)))_p =\(cos delta sin h\,med cos delta cos h\,med sin delta\). $ ]) #emph[Reading.] The solar direction unit vector $hat(upright(bold(S)))_p$ is decomposed into equatorial coordinates with declination $delta$ and hour angle $h$. In the world frame, the Sun's direction is $hat(upright(bold(S)))_w = R thin hat(upright(bold(S)))_p$: #math.equation(block: true, numbering: equation-numbering, [ $ hat(upright(bold(S)))_w = vec(- cos delta sin h, - sin phi cos delta cos h + cos phi sin delta, cos phi cos delta cos h + sin phi sin delta) . $ ]) #emph[Reading.] The world-frame solar vector $hat(upright(bold(S)))_w$ specifies the direction of incoming sunlight; its vertical $Z$-component is the sine of the solar altitude angle $a_dot.o$. The shadow ray originates at the nodus $upright(bold(N))$ and propagates in the direction $- hat(upright(bold(S)))_w$: #math.equation(block: true, numbering: equation-numbering, [ $ upright(bold(P))\(k\)= upright(bold(N)) - k thin hat(upright(bold(S)))_w\,#h(2em) k > 0 . $ ]) #emph[Reading.] A point $upright(bold(P))\(k\)$ along the shadow ray is obtained by starting at the nodus $upright(bold(N))$ and moving a positive scalar distance $k$ away from the Sun along the direction $- hat(upright(bold(S)))_w$. A point $upright(bold(P))$ lies on the surface of a cone with vertex at the origin, axis $hat(upright(bold(C)))$, and half-angle $alpha$ if and only if: #math.equation(block: true, numbering: equation-numbering, [ $ \(upright(bold(P)) dot.op hat(upright(bold(C)))\)^2=\|upright(bold(P))\|^2cos^2 alpha\,#h(2em) upright(bold(P)) dot.op hat(upright(bold(C))) < 0 . $ ]) #emph[Reading.] The squared scalar projection of the vector $upright(bold(P))$ onto the axis $hat(upright(bold(C)))$ equals the squared length of $upright(bold(P))$ multiplied by $cos^2 alpha$, subject to the condition that $upright(bold(P)) dot.op hat(upright(bold(C))) < 0$ to select the south-opening nappe. Substituting #ref(, supplement: [Equation]) into #ref(, supplement: [Equation]) yields a quadratic equation in the ray parameter $k$: #math.equation(block: true, numbering: equation-numbering, [ $ A_k thin k^2 + 2 thin B_k thin k + C_k = 0\, $ ]) where, noting that $upright(bold(N)) = d thin hat(upright(bold(O))) = - d thin hat(upright(bold(C)))$ (so $upright(bold(N)) dot.op hat(upright(bold(C))) = - d$ and $\|upright(bold(N))\|^2= d^2$), the coefficients are: #math.equation(block: true, numbering: equation-numbering, [ $ A_k & =\(hat(upright(bold(S)))_w dot.op hat(upright(bold(C)))\)^2- cos^2 alpha = sin^2 delta - cos^2 alpha\,\ B_k & = d (hat(upright(bold(S)))_w dot.op hat(upright(bold(C))) - cos^2 alpha thin \( hat(upright(bold(O))) dot.op hat(upright(bold(S)))_w \)) = d sin delta thin\(1 + cos^2 alpha\)dots.h\ C_k & = d^2\(1 - cos^2 alpha\)= d^2 sin^2 alpha . $ ]) #emph[Reading.] The intersection of the shadow ray with the cone surface reduces to a standard quadratic equation whose positive root $k$ yields the unique physical shadow point on the interior nappe. = The Day-Line Circularity Theorem A seasonal #emph[day-line] is the continuous curve traced by the nodus shadow on the cone as the Sun moves from sunrise ($h_(upright(r i s e))$) to sunset ($h_(upright(s e t))$) at fixed declination $delta$. #arxivai.method-box(title: [Theorem: Day-Line Circularity])[ For any fixed solar declination $delta$, the shadow locus on the interior surface of a conic sundial with its nodus on the polar axis is an exact planar circle orthogonal to the cone axis $hat(bold(C))$. ] #emph[Proof.] The nodus $upright(bold(N))$ lies on the axis of rotational symmetry $hat(upright(bold(C)))$. For a fixed solar declination $delta$, the diurnal path of the Sun is a great or small circle centered on the celestial polar axis. The entire physical system --- the light source path, the shadow-casting nodus, and the cone surface --- is strictly invariant under rotations about $hat(upright(bold(C)))$. Let $upright(bold(P))\(h\)$ be the shadow point at hour angle $h$. A change in hour angle $Delta h$ corresponds to a pure rigid rotation of the incident ray about $hat(upright(bold(C)))$ by angle $Delta h$. Because the cone is a surface of revolution about $hat(upright(bold(C)))$, the resulting intersection point $upright(bold(P))\(h + Delta h\)$ is obtained simply by rotating $upright(bold(P))\(h\)$ by $Delta h$ around $hat(upright(bold(C)))$. Therefore, the axial distance $ell\(delta\)= - upright(bold(P)) dot.op hat(upright(bold(C)))$ and the radial distance $r\(delta\)=\|upright(bold(P)) times hat(upright(bold(C)))\|$ are strictly constant for all $h in\[h_(upright(r i s e))\,h_(upright(s e t))\]$. A locus of constant axial position and constant radius on a cone is an exact circle lying in a plane perpendicular to $hat(upright(bold(C)))$. $square.filled.medium$ #ref(, supplement: [Figure]) displays the geometry of the cone surface unfolded into a flat plane. #figure([ #box(image("figures/fig-unfolded.svg")) ], caption: figure.caption( position: bottom, [ Unfolded cone surface for half-angle $alpha = 45^compose$ (sector angle $2 pi sin 45^compose approx 254.6^compose$). The apex $A$ is at the top center. The central vertical line is the noon meridian generator ($h = 0$). Straight radial lines represent hour lines. The three seasonal day-lines --- winter solstice (blue, inner), equinox (green, middle), and summer solstice (red, outer) --- unfold to exact concentric circular arcs centered on $A$. ]), kind: "quarto-float-fig", supplement: "Figure", ) = Proportions and the Constructor's Vocabulary Ancient sundial makers did not specify their instruments using decimal degree angles. They operated in a coherent language of geometric proportions, expressing shadow lengths, cone openings, and day-line positions as ratios. == The Equinox Invariant Evaluating the shadow projection at the astronomical equinox ($delta = 0$): #math.equation(block: true, numbering: equation-numbering, [ $ ell_E equiv - upright(bold(P))\(delta = 0\)dot.op hat(upright(bold(C))) = d . $ ]) #emph[Reading.] At the equinox ($delta = 0$), the sunlight vector is strictly perpendicular to the polar axis ($hat(upright(bold(S)))_w dot.op hat(upright(bold(C))) = sin 0 = 0$). The shadow ray cast by the nodus lies in the plane perpendicular to the axis passing through the nodus itself. Consequently, the equinoctial day-line circle sits at an axial distance $ell_E$ from the apex that is identically equal to the nodus distance $d$, regardless of the cone half-angle $alpha$ or latitude $phi$. The corresponding slant distance $L_E$ measured along the meridian generator on the stone surface is: #math.equation(block: true, numbering: equation-numbering, [ $ L_E = frac(ell_E, cos alpha) = frac(d, cos alpha) . $ ]) #emph[Reading.] The slant distance $L_E$ from the apex to the equinoctial noon mark equals the nodus distance $d$ divided by the cosine of the cone half-angle $alpha$. == The Workshop Rule $x$ and Solstitial Spacings For any solar declination $delta$, the axial distance $ell\(delta\)$ from the apex to the noon shadow mark on the meridian is given by: #math.equation(block: true, numbering: equation-numbering, [ $ ell\(delta\)= frac(d, 1 - tan alpha thin tan delta) . $ ]) #emph[Reading.] The axial distance $ell\(delta\)$ equals the nodus distance $d$ divided by the quantity $1 - tan alpha tan delta$. Evaluating #ref(, supplement: [Equation]) at the summer solstice ($delta = + epsilon$) and winter solstice ($delta = - epsilon$), we define the fundamental dimensionless #strong[workshop ratio]: #math.equation(block: true, numbering: equation-numbering, [ $ x := tan alpha thin tan epsilon . $ ]) #emph[Reading.] The workshop ratio $x$ is the product of the tangent of the cone half-angle $alpha$ and the tangent of the obliquity of the ecliptic $epsilon$. The solstitial axial distances become: #math.equation(block: true, numbering: equation-numbering, [ $ ell_S = frac(d, 1 - x)\,#h(2em) ell_W = frac(d, 1 + x) . $ ]) #emph[Reading.] The summer solstice noon mark sits at axial distance $d\/\(1 - x\)$ from the apex (deepest into the cone), while the winter solstice noon mark sits at axial distance $d\/\(1 + x\)$ (closest to the apex). The three seasonal noon marks on the meridian generator thus satisfy the celebrated #strong[noon-mark triple]: #math.equation(block: true, numbering: equation-numbering, [ $ ell_W : ell_E : ell_S = frac(1, 1 + x) : 1 : frac(1, 1 - x) . $ ]) #emph[Reading.] The ratio of winter, equinox, and summer axial noon marks depends exclusively on the single parameter $x$. For the standard Hellenistic workshop choice $x = 1\/4$ (obtained, for example, with $alpha = 30^compose$ and $epsilon approx 23.5^compose$), this ratio yields the integers $12 : 15 : 20$. #ref(, supplement: [Table]) summarizes the complete attribute vocabulary of the conic dial. #figure([ #table( columns: (33.33%, 33.33%, 33.33%), align: (left,left,left,), table.header([Attribute], [Historical Notation], [Geometric Meaning],), table.hline(), [Gnomon standard], [$g = 60$], [Sexagesimal parts of the vertical gnomon], [Klima ratio], [$sigma_E = s_(upright(e q)) : g$], [Equinoctial noon shadow; $sigma_E = tan phi$], [Solstitial shadow ratios], [$sigma_S\,sigma_W$], [$sigma_S = tan\(phi - epsilon\)$, $sigma_W = tan\(phi + epsilon\)$], [Cone opening ratio], [$rho = R_(upright(r i m)) : H$], [$rho = tan alpha$\; ratio of rim radius to cone height], [Nodus distance], [$d$], [Apex-to-nodus distance along axis; scale unit], [Equinox invariant], [$ell_E : d = 1 : 1$], [Equinoctial circle sits at distance $d$ from apex], [Workshop rule], [$x = tan alpha tan epsilon$], [Dimensionless factor governing solstitial marks], [Noon-mark triple], [$ell_W : ell_E : ell_S$], [Triplet of axial noon distances: $\(1 + x\)^(- 1): 1 :\(1 - x\)^(- 1)$], [Equinoctial division], [$H_E = 90^compose$], [Quarter-circle in 6 seasonal hours ($15^compose\/upright(h)$); calibration invariant], [Solstitial division], [$H\(plus.minus epsilon\)$], [$cos H = - tan phi tan\(plus.minus epsilon\)$\; where $phi$ enters the network], ) ], caption: figure.caption( position: top, [ The attribute vocabulary of the ancient conic sundial. Every entry is a proportion or an integer count; degree values are modern conversions. ]), kind: "quarto-float-tbl", supplement: "Table", ) = The Klimata Tradition and the Vertical Gnomon Greek mathematical geography divided the inhabited world into latitudinal zones called #emph[klimata], defined by the length of the longest day and the shadow cast by a vertical gnomon of $g = 60$ parts at noon @neugebauer1975@toomer1984. #ref(, supplement: [Figure]) illustrates the vertical gnomon shadow triangle for Alexandria. #figure([ #box(image("figures/fig-klima.svg")) ], caption: figure.caption( position: bottom, [ The vertical gnomon shadow triangle for Alexandria ($phi = 30^compose 58'$). A vertical gnomon of height $g = 60$ parts casts noon shadows of length $s_S = 7\;29$ (summer solstice), $s_E = 36\;00$ (equinox), and $s_W = 85\;08$ (winter solstice). The equinoctial ratio is exactly $g : s_E = 60 : 36 = 5 : 3$. ]), kind: "quarto-float-fig", supplement: "Figure", ) The vertical gnomon and the conic sundial represent dual geometric realisations of the same astronomical quantities: - In the #strong[vertical gnomon], the receiving surface is horizontal ($Z = 0$), and the latitude $phi$ is recorded directly in the equinoctial shadow length $s_E = g tan phi$. - In the #strong[conic sundial], the receiving surface is an inclined cone whose axis is tilted at angle $phi$. The equinoctial mark on the cone is invariant ($ell_E = d$), and the latitude is recorded in the spatial orientation of the cone axis and the angular span of the solstitial hour network. #ref(, supplement: [Table]) lists the canonical shadow lengths across the seven ancient klimata computed using Ptolemy's obliquity $epsilon = 23^compose 51' 20''$ @toomer1984[Book II]. #figure([ #table( columns: (11.76%, 14.71%, 14.71%, 14.71%, 14.71%, 14.71%, 14.71%), align: (left,center,center,center,center,center,center,), table.header([Location], [Klima], [Latitude $phi$], [Equinox $s_(upright(e q))$], [Summer $s_(upright(s u))$], [Winter $s_(upright(w i))$], [$sigma_E = s_(upright(e q))\/g$],), table.hline(), [Syene], [II], [$23^compose 51'$], [$26\;32$], [$0\;00$ (zenith)], [$65\;57$], [$0.442$], [Alexandria], [III], [$30^compose 58'$], [$36\;00$], [$7\;29$], [$85\;08$], [$0.600$], [Rhodes], [IV], [$36^compose 00'$], [$43\;36$], [$12\;55$], [$103\;19$], [$0.727$], [Delos], [---], [$37^compose 24'$], [$45\;52$], [$14\;27$], [$109\;23$], [$0.765$], [Athens], [---], [$37^compose 58'$], [$46\;49$], [$15\;05$], [$112\;00$], [$0.780$], [Hellespont], [V], [$40^compose 56'$], [$52\;02$], [$18\;26$], [$127\;27$], [$0.867$], [Rome], [---], [$41^compose 54'$], [$53\;50$], [$19\;33$], [$133\;14$], [$0.897$], [Massalia], [VI], [$43^compose 05'$], [$56\;07$], [$20\;56$], [$140\;56$], [$0.935$], ) ], caption: figure.caption( position: top, [ Canonical noon shadow lengths for a vertical gnomon of $g = 60$ parts, computed from Ptolemy's klimata table ($epsilon = 23^compose 51' 20''$). Sexagesimal parts ($p\;q = p + q\/60$). ]), kind: "quarto-float-tbl", supplement: "Table", ) = Inversion: From Surface Marks to Construction Parameters When reconstructing an ancient sundial from a 3D scan, we face the inverse problem: given the coordinates of surviving engraved marks on the stone, recover $\(alpha\,d\,phi\,A\)$. == Classical Inversion (Apex $A$ Preserved) If the apex $A$ is physically preserved, parameter recovery proceeds directly: + Measure slant distances from $A$ to the noon marks: $L_S = parallel upright(bold(P))_S - A parallel$, $L_E = parallel upright(bold(P))_E - A parallel$, $L_W = parallel upright(bold(P))_W - A parallel$. + Compute the solstitial slant ratio: #math.equation(block: true, numbering: equation-numbering, [ $ L_S / L_W = ell_S / ell_W = frac(1 + x, 1 - x) = frac(1 + tan alpha tan epsilon, 1 - tan alpha tan epsilon) . $ ]) #emph[Reading.] The ratio of summer to winter slant distances depends solely on $alpha$ and $epsilon$, completely independent of latitude $phi$. + Invert #ref(, supplement: [Equation]) for the cone half-angle: #math.equation(block: true, numbering: equation-numbering, [ $ tan alpha = frac(1, tan epsilon) (frac(L_S\/L_W - 1, L_S\/L_W + 1)) . $ ]) #emph[Reading.] The tangent of the half-angle equals the normalized difference-to-sum ratio of the solstitial slant marks divided by $tan epsilon$. + Compute the nodus distance using the equinox invariant: #math.equation(block: true, numbering: equation-numbering, [ $ d = L_E cos alpha . $ ]) #emph[Reading.] The nodus distance $d$ equals the equinoctial slant distance $L_E$ multiplied by $cos alpha$. #ref(, supplement: [Table]) lists the slant ratio $L_S\/L_W$ as a function of half-angle $alpha$ at $epsilon = 23.44^compose$. #figure([ #table( columns: (8.16%, 10.2%, 10.2%, 10.2%, 10.2%, 10.2%, 10.2%, 10.2%, 10.2%, 10.2%), align: (left,center,center,center,center,center,center,center,center,center,), table.header([Half-Angle $alpha$], [$20^compose$], [$25^compose$], [$30^compose$], [$35^compose$], [$40^compose$], [$45^compose$], [$50^compose$], [$55^compose$], [$60^compose$],), table.hline(), [Ratio $L_S\/L_W$], [$1.37$], [$1.50$], [$1.67$], [$1.88$], [$2.14$], [$2.53$], [$3.14$], [$4.19$], [$7.03$], ) ], caption: figure.caption( position: top, [ Solstice slant-distance ratio $L_S\/L_W$ as a function of cone half-angle $alpha$ ($epsilon = 23.44^compose$). ]), kind: "quarto-float-tbl", supplement: "Table", ) == Apex-Free Inversion via the Marking Ratio $Q$ On damaged fragments where the apex $A$ is broken away, the three seasonal noon marks $P_S\,P_E\,P_W$ alone suffice to recover $alpha$, $A$, and $d$ in closed form. We define the dimensionless #strong[marking ratio] $Q$: #math.equation(block: true, numbering: equation-numbering, [ $ Q := frac(L_S - L_W, L_S - L_E) . $ ]) #emph[Reading.] $Q$ is the ratio of the total solstitial distance $\(L_S - L_W\)$ to the summer-to-equinox distance $\(L_S - L_E\)$ along the meridian generator. Expressing the slant differences in terms of $d\,alpha\,$ and $x = tan alpha tan epsilon$: #math.equation(block: true, numbering: equation-numbering, [ $ L_S - L_W = frac(d, cos alpha) (frac(1, 1 - x) - frac(1, 1 + x)) = frac(2 d thin x, cos alpha thin\(1 - x^2\))\, $ ]) #math.equation(block: true, numbering: equation-numbering, [ $ L_S - L_E = frac(d, cos alpha) (frac(1, 1 - x) - 1) = frac(d thin x, cos alpha thin\(1 - x\)) . $ ]) Dividing #ref(, supplement: [Equation]) by #ref(, supplement: [Equation]): #math.equation(block: true, numbering: equation-numbering, [ $ Q = frac(2, 1 + x) = frac(2, 1 + tan alpha tan epsilon) . $ ]) #emph[Reading.] The marking ratio $Q$ is a simple rational function of the workshop parameter $x$, completely independent of the scale $d$ and latitude $phi$. Solving #ref(, supplement: [Equation]) explicitly for $alpha$: #math.equation(block: true, numbering: equation-numbering, [ $ alpha = arctan #h(-1em) (frac(2 - Q, Q thin tan epsilon))\,#h(2em) 1 < Q < 2 . $ ]) #emph[Reading.] The cone half-angle $alpha$ is the inverse tangent of $\(2 - Q\)$ divided by the product $Q tan epsilon$. #arxivai.concept-box(title: [Physical Scope of the $Q$-Formula])[ The mathematical condition $1 < Q < 2$ corresponds to $0 < x < 1$, which is the exact physical condition that the cone opens ($alpha > 0 degree$) and that the summer solstice rays strike the interior nappe ($alpha < 90 degree - epsilon$). ] === The Step-by-Step Apex-Free Algorithm + #strong[Generator Direction:] Compute the unit direction vector along the meridian from $P_S$ toward $P_W$ (inward toward the apex): #math.equation(block: true, numbering: equation-numbering, [ $ hat(upright(bold(g))) = frac(upright(bold(P))_W - upright(bold(P))_S, parallel upright(bold(P))_W - upright(bold(P))_S parallel) . $ ]) #emph[Reading.] $hat(upright(bold(g)))$ is the unit vector pointing along the meridian line from the summer mark toward the winter mark. + #strong[Projected Segment Lengths:] Compute the total baseline $g_(upright(l e n))$ and the projected equinox distance $t_E$: #math.equation(block: true, numbering: equation-numbering, [ $ g_(upright(l e n)) = parallel upright(bold(P))_W - upright(bold(P))_S parallel\,#h(2em) t_E =\(upright(bold(P))_E - upright(bold(P))_S\)dot.op hat(upright(bold(g))) . $ ]) #emph[Reading.] $g_(upright(l e n))$ is the physical distance between summer and winter marks; $t_E$ is the projected distance from summer to equinox. Collinearity is verified if the orthogonal residual $parallel upright(bold(P))_E -\(upright(bold(P))_S + t_E hat(upright(bold(g)))\)parallel$ is within scan noise ($lt.tilde 0.3 thin upright(m m)$). + #strong[Recover Half-Angle $alpha$:] Compute $Q = g_(upright(l e n))\/t_E$ and evaluate $alpha = arctan\(\(2 - Q\)\/\(Q tan epsilon\)\)$. + #strong[Locate the Apex $A$:] The slant ratio $r_S = L_S\/L_E = 1\/\(1 - x\)$ gives the apex distance parameter $t_A$: #math.equation(block: true, numbering: equation-numbering, [ $ t_A = frac(r_S thin t_E, r_S - 1) = L_S\,#h(2em) A = upright(bold(P))_S + t_A thin hat(upright(bold(g))) . $ ]) #emph[Reading.] The distance $t_A$ along $hat(upright(bold(g)))$ from $P_S$ places the true apex $A$ in 3D space. + #strong[Recover Scale $d$:] #math.equation(block: true, numbering: equation-numbering, [ $ L_E = t_A - t_E\,#h(2em) d = L_E cos alpha . $ ]) #emph[Reading.] Subtracting $t_E$ from $L_S$ gives $L_E$, whose product with $cos alpha$ yields the scale $d$. == Independent Latitude Recovery ($epsilon$-Free) Latitude $phi$ is recovered independently of the noon marks by pairing the radial placement $x$ of a solstitial day-line with its measured half-day hour angle $H$: #math.equation(block: true, numbering: equation-numbering, [ $ tan phi = tan alpha thin frac(\|cos tilde(H)\|, \|x\|) . $ ]) #emph[Reading.] The tangent of latitude $phi$ equals $tan alpha$ multiplied by the ratio of the absolute cosine of the unit-calibrated half-day arc $tilde(H)$ to the placement parameter $x$. The realized epoch obliquity $tan delta$ cancels out completely, rendering the latitude recovery robust against epoch uncertainties. == Marking Sufficiency #ref(, supplement: [Table]) catalogs which parameters are determinable from various observable feature sets. #figure([ #table( columns: (25%, 25%, 25%, 25%), align: (left,left,left,left,), table.header([Available Marking Set], [Recoverable Parameters], [Undetermined Parameters], [Analytical Method],), table.hline(), [${ P_S\,P_E }$], [Meridian generator line $hat(upright(bold(g)))$, segment $L_S - L_E$], [$alpha\,d\,phi\,A$], [Linear interpolation], [${ P_S\,P_E\,P_W }$], [$Q$, half-angle $alpha$, apex $A$, slants $L_S\,L_E\,L_W$, scale $d$], [Latitude $phi$, axis tilt], [$Q$-inversion (#ref(, supplement: [Equation])--#ref(, supplement: [Equation]))], [${ P_S\,P_E\,P_W } + gt.eq 3$ hour marks], [Complete geometry: $alpha\,d\,A\,hat(upright(bold(C)))\,phi$], [None (complete reconstruction)], [$Q$-inversion + 3D circle fit], [${ A\,P_S\,P_E\,P_W }$], [$alpha\,d\,L_S\,L_E\,L_W$], [Latitude $phi$], [Classical inversion (#ref(, supplement: [Equation]))], [Dressed seat & upper front face], [Cone axis tilt $phi$, face orientation], [Scale $d$, half-angle $alpha$], [Plane normal regression], ) ], caption: figure.caption( position: top, [ Marking sufficiency catalog for conic sundial reconstruction. ]), kind: "quarto-float-tbl", supplement: "Table", ) = Synthetic Validation: A Rhodes Construction We validate the apex-free algorithm on an exact synthetic model constructed for Rhodes ($phi = 36.00^compose$, $alpha = 45.00^compose$, $d = 100.00 thin upright(m m)$, $epsilon = 23.44^compose$). + #strong[Forward Generation:] - $x = tan 45^compose tan 23.44^compose = 0.433568$. - Axial marks: $ell_S = 176.544 thin upright(m m)$, $ell_E = 100.000 thin upright(m m)$, $ell_W = 69.756 thin upright(m m)$. - Slant marks ($L = ell\/cos 45^compose$): $L_S = 249.670 thin upright(m m)$, $L_E = 141.421 thin upright(m m)$, $L_W = 98.650 thin upright(m m)$. + #strong[Segment Input:] - $g_(upright(l e n)) = L_S - L_W = 151.020 thin upright(m m)$. - $t_E = L_S - L_E = 108.249 thin upright(m m)$. + #strong[Inverse Recovery:] - Marking ratio: $Q = 151.020\/108.249 = 1.395121$. - Half-angle: $ alpha = arctan #h(-1em) (frac(2 - 1.395121, 1.395121 times tan 23.44^compose)) = arctan\(1.000000\)= 45.00^compose . $ - Scale recovery: $r_S = 1\/\(1 - 0.433568\)= 1.765436$\; $t_A =\(1.765436 times 108.249\)\/0.765436 = 249.670 thin upright(m m) = L_S$. - Equinox slant: $L_E = 249.670 - 108.249 = 141.421 thin upright(m m)$. - Nodus distance: $d = 141.421 times cos 45^compose = 100.000 thin upright(m m)$. #ref(, supplement: [Table]) confirms exact numerical closure. #figure([ #table( columns: (21.05%, 26.32%, 26.32%, 26.32%), align: (left,center,center,center,), table.header([Parameter], [Nominal Ground Truth], [Inverted Estimate], [Absolute Error],), table.hline(), [Half-angle $alpha$], [$45.0000^compose$], [$45.0000^compose$], [$< 10^(- 6 thin compose)$], [Marking ratio $Q$], [$1.395121$], [$1.395121$], [$< 10^(- 6)$], [Slant ratio $L_S\/L_W$], [$2.530873$], [$2.530873$], [$< 10^(- 6)$], [Nodus scale $d$], [$100.000 thin upright(m m)$], [$100.000 thin upright(m m)$], [$< 10^(- 5) thin upright(m m)$], ) ], caption: figure.caption( position: top, [ Numerical verification of closed-form parameter recovery on the synthetic Rhodes model. ]), kind: "quarto-float-tbl", supplement: "Table", ) = What Archaeological Stones Add Applying this analytical geometry to scanned archaeological stones introduces real-world physical effects documented in the companion studies of ObjID 18 (British Museum inv. 2547) @grasshoff2026measurement@bsdp2014dialface18 and ObjID 126 (Delos) @grasshoff2026objid126: + #strong[Engraved Hour Lines as Circular Arcs:] On ObjID 18, the engraved hour lines are circular arcs with radii between $113 thin upright(m m)$ and $280 thin upright(m m)$ (fit RMS $0.20$--$0.71 thin upright(m m)$), rather than mathematical generators (which leave bow residuals of $2.2$--$7.6 thin upright(m m)$). The straight line of the theoretical cone represents the geometric ideal; the circular arc is the artisan's physical realization. + #strong[Groove Centreline Extraction:] At photogrammetric scan resolutions, the V-shaped chisel notch of worn engravings lies within the $plus.minus 0.3 thin upright(m m)$ surface noise floor. Centreline extraction must be performed by medial-line filtering across selected feature bands rather than unconstrained depth minimization. + #strong[Construction Error Attribution:] On ObjID 18, the winter hour division and cone axis yield a consensus latitude of $phi = 41.45^compose plus.minus 0.30^compose$ ($s = 53\;02$ for $g = 60$, corresponding to Ptolemy's Hellespont/Rome klimata), while the summer hour division deviates at $14 sigma$ --- an isolated ancient artisan error correctly identified by leave-one-out diagnostics rather than obscured by global averaging. = Constraint Catalog #ref(, supplement: [Table]) summarizes the complete set of formal geometric constraints governing the conic sundial with a horizontal gnomon. #figure([ #table( columns: (33.33%, 33.33%, 33.33%), align: (left,left,left,), table.header([Constraint ID], [Physical Name], [Formal Mathematical Expression],), table.hline(), [#strong[N1]], [Nodus on Polar Axis & Horizon], [$upright(bold(N))_(upright(p h y s)) =\(0\,0\,0\)$\; in math frame: $upright(bold(N)) = d thin hat(upright(bold(O)))$], [#strong[G1]], [Gnomon in Meridian Plane], [Horizontal rod at $X = 0\,Z = 0$, extending northward ($+ Y_w$)], [#strong[C1]], [Apex on Polar Axis], [$A_(upright(p h y s)) = d thin hat(upright(bold(C)))$\; in math frame: $A =\(0\,0\,0\)$], [#strong[C2]], [Cone Axis = Polar Axis], [$hat(upright(bold(C))) =\(0\,med cos phi\,med sin phi\)$], [#strong[C3]], [South-Opening Nappe], [$hat(upright(bold(O))) = - hat(upright(bold(C)))$\; $upright(bold(P)) dot.op hat(upright(bold(C))) < 0$], [#strong[C4]], [Cavity Scale Bound], [$d < H$ (nodus located within cone cavity)], [#strong[C5]], [Rim Circularity], [$R_(upright(r i m)) = H tan alpha$ in plane orthogonal to $hat(upright(bold(C)))$], [#strong[E1]], [Equinox Invariant], [$ell_E = d$ for all $alpha\,phi$], [#strong[E2]], [Workshop Proportions], [$x = tan alpha tan epsilon$\; $ell_S = d\/\(1 - x\)\,ell_W = d\/\(1 + x\)$], [#strong[E3]], [Noon Triplet Uncoupling], [$ell_W : ell_E : ell_S =\(1 + x\)^(- 1): 1 :\(1 - x\)^(- 1)$ (independent of $phi$)], [#strong[H1]], [Equinoctial Calibration], [$H_E = 90^compose$ at all latitudes (engraver's unit standard)], [#strong[H2]], [Solstitial Hour Arc], [$cos H\(plus.minus epsilon\)= - tan phi tan\(plus.minus epsilon\)$], [#strong[M1]], [Meridian Collinearity], [$P_x = 0$ at $h = 0$ for all solar declinations $delta$], ) ], caption: figure.caption( position: top, [ Complete constraint catalog for the conic sundial with horizontal gnomon. ]), kind: "quarto-float-tbl", supplement: "Table", ) = Conclusion The construction geometry of the ancient conic sundial with a nodus on the polar axis is governed by an elegant uncoupling: the three seasonal noon marks on the meridian generator encode the cone half-angle $alpha$ and scale $d$ without any dependence on geographical latitude $phi$. The closed-form $Q$-formula enables exact reconstruction of damaged fragments even when the apex is missing. Latitude $phi$ must be derived from the solstitial hour division or the dressed reference planes of the block. By grounding computational 3D analysis in this rigorous proportional framework, archaeological sundials can be recovered not merely as geometric meshes, but as precise historical witnesses to ancient mathematical astronomy. #heading(level: 1, numbering: none)[References] #bibliography(("references.bib"))