Zum Inhalt springen

Datei:Mrs Miniver's Problem.svg

Seiteninhalte werden in anderen Sprachen nicht unterstützt.
Zur Beschreibungsseite auf Commons
aus Wikipedia, der freien Enzyklopädie

Originaldatei (SVG-Datei, Basisgröße: 900 × 348 Pixel, Dateigröße: 793 Bytes)

Diese Datei und die Informationen unter dem roten Trennstrich werden aus dem zentralen Medienarchiv Wikimedia Commons eingebunden.

Zur Beschreibungsseite auf Commons


Beschreibung

Beschreibung
English: Three instances of Mrs. Miniver's problem, of arranging two circles so that their area of overlap equals the area of their symmetric difference. In each case the inner yellow area equals the total area of the surrounding blue regions. The left case shows two circles of equal areas, the right case shows one circle with twice the area of the other, and the middle case is intermediate between these two.
Datum
Quelle Eigenes Werk
Urheber David Eppstein

Lizenz

Ich, der Urheber dieses Werkes, veröffentliche es unter der folgenden Lizenz:
Creative Commons CC-Zero Diese Datei wird unter der Creative-Commons-Lizenz CC0 1.0 Verzicht auf das Copyright zur Verfügung gestellt.
Die Person, die das Werk mit diesem Dokument verbunden hat, übergibt dieses weltweit der Gemeinfreiheit, indem sie alle Urheberrechte und damit verbundenen weiteren Rechte – im Rahmen der jeweils geltenden gesetzlichen Bestimmungen – aufgibt. Das Werk kann – selbst für kommerzielle Zwecke – kopiert, modifiziert und weiterverteilt werden, ohne hierfür um Erlaubnis bitten zu müssen.

Source code

from math import pi,asin,sin,cos,acos
from PADS.SVG import *
import sys

# Circular segment formulas from https://en.wikipedia.org/wiki/Circular_segment

def areaFromRadius(r): return pi*r**2

def twoCircleArea(r1,r2): return areaFromRadius(r1)+areaFromRadius(r2)

def angleFromChord(r,c):
    return 2*asin(c/(2*r))

def areaFromAngle(r,theta):
    return r**2*(theta-sin(theta))/2

def areaFromChord(r,c):
    theta = angleFromChord(r,c)
    return areaFromAngle(r,theta)

def distanceToChord(r,c):
    theta = angleFromChord(r,c)
    return r*cos(theta/2)

def separationFromChord(r1,r2,c):
    return distanceToChord(r1,c)+distanceToChord(r2,c)

# Bisection to solve Mrs. Miniver's problem within floating point accuracy

def miniverSeparation(r1,r2):
    if r1 > r2: r1,r2 = r2,r1   # make sure small circle first
    totalArea = twoCircleArea(r1,r2)
    targetArea = totalArea/3

    def miniverTest(x):
        # x = cos(chord on small circle), -1: outside, 1: inside
        chord = 2*r1*sin(acos(x))
        area1 = areaFromChord(r1,chord)
        if x > 0:
            area1 = areaFromRadius(r1) - area1
        area2 = areaFromChord(r2,chord)
        return area1 + area2 < targetArea

    lo,hi = -1.0,1.0
    for i in range(100):
        mid = (hi+lo)/2
        if miniverTest(mid):
            lo = mid
        else:
            hi = mid
    chord = 2*r1*sin(acos(mid))
    return distanceToChord(r2,chord) - r1*mid

# Make it into a nice picture
# Monochromatic and with a loose frame for now; we'll fix it up later

gridUnit = 150
targetArea = 100000.0
boundingBox = (6+4j)*gridUnit
output = SVG(boundingBox,sys.stdout)
output.group(fill="none",stroke="#000")

for i in (0,1,2):
    ratio = 2.0**(i*0.25)
    areaWhenSmall = twoCircleArea(1.0,ratio)
    factor = (targetArea/areaWhenSmall)**0.5
    r1,r2 = factor,factor*ratio
    s = miniverSeparation(r1,r2)
    o = (1+2j+2*i)*gridUnit
    output.circle(o + (s+r2-r1)*0.5j, r1)
    output.circle(o - (s+r1-r2)*0.5j, r2)
  
output.ungroup()
output.close()

Kurzbeschreibungen

Ergänze eine einzeilige Erklärung, was diese Datei darstellt.
Three instances of Mrs. Miniver's Problem

In dieser Datei abgebildete Objekte

Motiv

image/svg+xml

Dateiversionen

Klicke auf einen Zeitpunkt, um diese Version zu laden.

Version vomVorschaubildMaßeBenutzerKommentar
aktuell21:35, 29. Mai 2022Vorschaubild der Version vom 21:35, 29. Mai 2022900 × 348 (793 Bytes)David EppsteinKeep outer circles as circles for tighter svg coding; should be no visible change
08:48, 29. Mai 2022Vorschaubild der Version vom 08:48, 29. Mai 2022900 × 348 (1 KB)David EppsteinUploaded own work with UploadWizard

Keine Seiten verwenden diese Datei.

Globale Dateiverwendung

Die nachfolgenden anderen Wikis verwenden diese Datei:

Metadaten