Der untere p5.js-Sketch ermöglicht die schnelle Bestimmung der Zahnradparameter, die in Kythera benötigt werden, um ein Zahnrad mit einem gewünschten Außendurchmesser zu erzeugen. Da Kythera keine direkte Durchmesserangabe zulässt und die Größe ausschließlich aus der Kombination von Zähnezahl (N) und Diametral Pitch (P) berechnet, übernimmt der Sketch genau diese Umrechnung: Aus einem eingegebenen Außendurchmesser in Millimetern wird automatisch die passende Zähnezahl für einen festgelegten Diametral Pitch berechnet. Damit lässt sich ohne manuelle Formelarbeit sofort ermitteln, welche Parameter in Kythera eingetragen werden müssen, um ein Zahnrad in der gewünschten Größe für den 3D-Druck oder die Weiterverarbeitung zu erzeugen.

Das ganze liegt auch auf der ct-lab.info-Webseite: https://ct-lab.info/gear-math/

P5.JS

let inputOD;
let buttonCalc;
let resultN;
let resultP;

function setup() {
  createCanvas(400, 200);

  // Eingabefeld für Außendurchmesser
  createP("Außendurchmesser des Zahnrads (mm):");
  inputOD = createInput("80"); 

  // Button
  buttonCalc = createButton("Berechnen");
  buttonCalc.mousePressed(calculateGear);

  // Ergebnisfelder
  resultN = createP("");
  resultP = createP("");
}

function calculateGear() {
  // Eingabe lesen
  let OD = float(inputOD.value());

  // Fester Diametral Pitch (wie in deinem funktionierenden Beispiel)
  let P = 1;

  // N berechnen
  let N = OD * P - 2;

  // runden, da N ganzzahlig sein muss
  let Nrounded = Math.round(N);

  // Ausgabe
  resultP.html("Diametral Pitch (P): " + P);
  resultN.html("Zähnezahl (N): " + Nrounded);
}

function draw() {
  background(240);
}

html

<!doctype html>
<html lang="de">
<head>
  <meta charset="utf-8">
  <title>Zahnrad-Berechnung für Kythera</title>
  <meta name="viewport" content="width=device-width, initial-scale=1">

  <!-- p5.js library -->
  <script src="https://cdn.jsdelivr.net/npm/p5@1.9.0/lib/p5.min.js"></script>

  <style>
    body {
      font-family: system-ui, -apple-system, BlinkMacSystemFont, "Helvetica Neue", Arial, sans-serif;
      margin: 20px;
    }
    #canvas-container {
      margin-bottom: 20px;
    }
    label {
      display: inline-block;
      min-width: 260px;
    }
  </style>
</head>
<body>

<h1>Zahnrad-Berechnung für Kythera</h1>
<p>
Gib einen gewünschten Außendurchmesser <strong>OD</strong> in Millimetern ein.  
Der Sketch berechnet daraus die benötigte Zähnezahl <strong>N</strong> für Kythera.  
Der Diametral Pitch <strong>P</strong> ist im Code auf <strong>1</strong> gesetzt (entspricht deinem aktuellen Workflow).
</p>

<div id="canvas-container"></div>

<div id="ui">
  <p>
    <label for="odInput">Außendurchmesser des Zahnrads (OD in mm):</label>
    <input id="odInput" type="number" value="80" step="0.1">
    <button id="calcButton">Berechnen</button>
  </p>

  <p id="resultP"></p>
  <p id="resultN"></p>
  <p id="resultOD"></p>
</div>

<script>
  // Fixed Diametral Pitch for Kythera.
  // If you want another value, change this constant.
  const FIXED_P = 1; // Diametral Pitch

  let resultP, resultN, resultOD;
  let odInput, calcButton;

  function setup() {
    // Small canvas; here only to satisfy p5.js. No drawing needed.
    const canvas = createCanvas(1, 1);
    canvas.parent("canvas-container");
    background(255);

    // Get DOM elements that already exist in the HTML.
    odInput    = select("#odInput");
    calcButton = select("#calcButton");
    resultP    = select("#resultP");
    resultN    = select("#resultN");
    resultOD   = select("#resultOD");

    calcButton.mousePressed(calculateGear);

    // Initial calculation
    calculateGear();
  }

  function draw() {
    // No continuous drawing required.
  }

  function calculateGear() {
    // Read OD input (mm)
    const ODmm = parseFloat(odInput.value());

    if (isNaN(ODmm) || ODmm <= 0) {
      resultP.html("Bitte einen Außendurchmesser &gt; 0 eingeben.");
      resultN.html("");
      resultOD.html("");
      return;
    }

    const P = FIXED_P;

    // Formula: OD = (N + 2) / P  (here used numerically in mm with P=1)
    // Solve for N: N = OD * P - 2
    const Nraw = ODmm * P - 2;
    const N = Math.round(Nraw); // N must be integer

    // Recomputed OD based on rounded N
    const ODcalc = (N + 2) / P;

    // Output
    resultP.html("Verwendeter Diametral Pitch (P): <strong>" + P.toFixed(3) + "</strong>");
    resultN.html("Berechnete Zähnezahl (N): <strong>" + N + "</strong> (vor Rundung: " + Nraw.toFixed(3) + ")");
    resultOD.html("Resultierender Außendurchmesser aus N und P: <strong>" + ODcalc.toFixed(3) + " mm</strong>");
  }
</script>

</body>
</html>