Mandelbrot mit JSXGraph
Aus Wiki1
(Unterschied zwischen Versionen)
| Zeile 1: | Zeile 1: | ||
<jsxgraph box="jxgbox" width="800" height="700"> | <jsxgraph box="jxgbox" width="800" height="700"> | ||
| - | + | const board = JXG.JSXGraph.initBoard('jxgbox', { | |
boundingbox: [-2.5, 1.5, 1.5, -1.5], | boundingbox: [-2.5, 1.5, 1.5, -1.5], | ||
axis: false, | axis: false, | ||
| Zeile 14: | Zeile 14: | ||
}); | }); | ||
| - | // Slider für Zoom | + | // Slider für Zoom (optional weiterhin nutzbar) |
const sliderZoom = board.create('slider', [[-2.3, 1.0], [1, 1.0], [1, 1, 500]], { | const sliderZoom = board.create('slider', [[-2.3, 1.0], [1, 1.0], [1, 1, 500]], { | ||
name:'Zoom', | name:'Zoom', | ||
| Zeile 43: | Zeile 43: | ||
} | } | ||
| - | // | + | // Ausschnittparameter |
let centerX = -0.5; | let centerX = -0.5; | ||
let centerY = 0; | let centerY = 0; | ||
| - | let baseWidth = 3.5; | + | let zoom = 1; |
| - | + | const baseWidth = 3.5; | |
| + | const baseHeight = 3.0; | ||
| - | function drawMandelbrot(maxIter | + | function drawMandelbrot(maxIter) { |
const spanX = baseWidth / zoom; | const spanX = baseWidth / zoom; | ||
const spanY = baseHeight / zoom; | const spanY = baseHeight / zoom; | ||
| Zeile 86: | Zeile 87: | ||
function update() { | function update() { | ||
| - | drawMandelbrot(Math.round(sliderIter.Value()) | + | drawMandelbrot(Math.round(sliderIter.Value())); |
| + | sliderZoom.setValue(zoom); // Slider synchronisieren | ||
} | } | ||
sliderIter.on('drag', update); | sliderIter.on('drag', update); | ||
| - | sliderZoom.on('drag', update); | + | sliderZoom.on('drag', () => { |
| + | zoom = sliderZoom.Value(); | ||
| + | update(); | ||
| + | }); | ||
// Panning mit Maus | // Panning mit Maus | ||
| Zeile 102: | Zeile 107: | ||
}); | }); | ||
| - | canvas.addEventListener('mouseup', () => { | + | canvas.addEventListener('mouseup', () => { isDragging = false; }); |
| - | + | canvas.addEventListener('mouseleave', () => { isDragging = false; }); | |
| - | + | ||
| - | + | ||
| - | canvas.addEventListener('mouseleave', () => { | + | |
| - | + | ||
| - | + | ||
canvas.addEventListener('mousemove', e => { | canvas.addEventListener('mousemove', e => { | ||
| Zeile 117: | Zeile 117: | ||
lastY = e.offsetY; | lastY = e.offsetY; | ||
| - | |||
| - | |||
const spanX = baseWidth / zoom; | const spanX = baseWidth / zoom; | ||
const spanY = baseHeight / zoom; | const spanY = baseHeight / zoom; | ||
| Zeile 127: | Zeile 125: | ||
update(); | update(); | ||
} | } | ||
| + | }); | ||
| + | |||
| + | // Zoom mit Mausrad | ||
| + | canvas.addEventListener('wheel', e => { | ||
| + | e.preventDefault(); | ||
| + | const zoomFactor = 1.2; | ||
| + | const rect = canvas.getBoundingClientRect(); | ||
| + | |||
| + | // Mausposition relativ zum Canvas | ||
| + | const px = e.clientX - rect.left; | ||
| + | const py = e.clientY - rect.top; | ||
| + | |||
| + | // Koordinaten in komplexer Ebene | ||
| + | const spanX = baseWidth / zoom; | ||
| + | const spanY = baseHeight / zoom; | ||
| + | const xMin = centerX - spanX/2; | ||
| + | const yMin = centerY - spanY/2; | ||
| + | const cx = xMin + (px / canvas.width) * spanX; | ||
| + | const cy = yMin + (py / canvas.height) * spanY; | ||
| + | |||
| + | if (e.deltaY < 0) { | ||
| + | // reinzoomen | ||
| + | zoom *= zoomFactor; | ||
| + | } else { | ||
| + | // rauszoomen | ||
| + | zoom /= zoomFactor; | ||
| + | } | ||
| + | |||
| + | // Mittelpunkt auf Mauszeiger ausrichten | ||
| + | const newSpanX = baseWidth / zoom; | ||
| + | const newSpanY = baseHeight / zoom; | ||
| + | centerX = cx - (px / canvas.width) * newSpanX; | ||
| + | centerY = cy - (py / canvas.height) * newSpanY; | ||
| + | |||
| + | update(); | ||
}); | }); | ||
// Initial zeichnen | // Initial zeichnen | ||
update(); | update(); | ||
| - | |||
</jsxgraph> | </jsxgraph> | ||
Version vom 11:04, 15. Sep. 2025
Mit den Schiebereglern können Iterations-Tiefe und Zoom gesteuert werden. Mit der Maus+linke Maustaste kann der Bildausschnitt verschoben werden.
Ein Hinweis:
Dieses Script wurde mit Hilfe mehrerer Prompts durch ChatGPT erstellt. Allerdings musste ich es an einzelnen Stellen anpassen, da es sonst nicht funktioniert hätte. Man kann also durch ChatGPT erstellen - benötigt aber zumindest Grundkenntnisse der jeweiligen Script- oder Programmiersprache. Im vorliegenden Fall wurde z.B. das Canvas-Bild so angeordnet, dass die Slider verdeckt waren. Die Position des Bildes musste leicht angepasst werden.
Hier die Prompts:
- gib mir jetzt einen jsxgraph-code für die erstellung einer Mandelbrot-Grafik mit regler zur Steuerung der Tiefe
- schlag mir eine schnellere variante vor (ChatGPT schlug eine Lösung mit canvas-Element vor)
- bitte ändere das script so, dass ich mit einem regler in die graphik zoomen kann
- mit der Maus soll der angezeigte Bereich des Bildes verschoben werden können
