From d81931b2db62581f0473197acf0706f2285e7796 Mon Sep 17 00:00:00 2001 From: monman53 Date: Wed, 3 Jul 2024 18:25:56 +0900 Subject: [PATCH] DoF for single lens and general sensor shape --- src/SVG/Guideline.vue | 48 +++++++------- src/SVG/SVG.vue | 14 ++-- src/globals.ts | 148 ++++++++++++++++++++++++++++++++---------- 3 files changed, 149 insertions(+), 61 deletions(-) diff --git a/src/SVG/Guideline.vue b/src/SVG/Guideline.vue index e003aa7..d83c3ef 100644 --- a/src/SVG/Guideline.vue +++ b/src/SVG/Guideline.vue @@ -6,8 +6,12 @@ import { vec, fGaussian } from '../math' import WithBackground from './WithBackground.vue' -const x = computed(() => { - return globalLensRe.value.H +const xBack = computed(() => { + return globalLensRe.value.forward.H +}) + +const xFront = computed(() => { + return globalLensRe.value.backward.H }) const f = computed(() => { @@ -16,7 +20,7 @@ const f = computed(() => { // Effective lens radius const re = computed(() => { - return globalLensRe.value.re + return globalLensRe.value.forward.re }) const sensorTop = computed(() => { @@ -43,15 +47,15 @@ const sensorMiddle = computed(() => { const focal = computed(() => { const s = sensorTop.value const t = sensorBottom.value - const ss = fGaussian(f.value, vec(x.value - s.x, s.y)) - const tt = fGaussian(f.value, vec(x.value - t.x, t.y)) - return { s: vec(x.value - ss.x, ss.y), t: vec(x.value - tt.x, tt.y) } + const ss = fGaussian(f.value, vec(xBack.value - s.x, s.y)) + const tt = fGaussian(f.value, vec(xBack.value - t.x, t.y)) + return { s: vec(xFront.value - ss.x, ss.y), t: vec(xFront.value - tt.x, tt.y) } }) // Angle of view const aov = computed(() => { - const lensTop = vec(x.value, -re.value) - const lensBottom = vec(x.value, re.value) + const lensTop = vec(xFront.value, -re.value) + const lensBottom = vec(xFront.value, re.value) const focalPlaneTop = focal.value.t const focalPlaneBottom = focal.value.s @@ -62,13 +66,13 @@ const aov = computed(() => { let middleInnerTop = focalPlaneBottom.sub(lensTop) let middleInnerBottom = focalPlaneTop.sub(lensBottom) // For over infinity modification - if (x.value + f.value > sensorMiddle.value.x) { + if (xBack.value + f.value > sensorMiddle.value.x) { middleOuterTop = middleOuterTop.minus().normalize().mul(infR.value) middleOuterBottom = middleOuterBottom.minus().normalize().mul(infR.value) middleInnerTop = middleInnerTop.minus().normalize().mul(infR.value) middleInnerBottom = middleInnerBottom.minus().normalize().mul(infR.value) } - if (x.value + f.value === sensorMiddle.value.x) { + if (xBack.value + f.value === sensorMiddle.value.x) { // middleOuterTop = vec(x.value - sensorMiddle.value.x, -sensor.value.r).normalize().mul(infR.value) // middleInnerTop = vec(x.value - sensorMiddle.value.x, sensor.value.r).normalize().mul(infR.value) } @@ -89,7 +93,7 @@ const dof = computed(() => { const sensorSize = st.length() const c = sensor.value.circleOfConfusion const v = st.normalize() - const s = sensor.value.s.add(vec(-x.value, 0)) + const s = sensor.value.s.add(vec(-xBack.value, 0)) let inner = "" let outer = "" @@ -102,7 +106,7 @@ const dof = computed(() => { const py = (a.y - r) / a.x * px + r const p = fGaussian(f.value, vec(-px, py)) - p.x = x.value - p.x + p.x = xFront.value - p.x p.y = p.y if (inner === "") { inner += `M ${p.x} ${p.y} ` @@ -118,7 +122,7 @@ const dof = computed(() => { const py = (a.y - r) / a.x * px + r const p = fGaussian(f.value, vec(-px, py)) - p.x = x.value - p.x + p.x = xFront.value - p.x p.y = p.y if (outer === "") { outer += `M ${p.x} ${p.y} ` @@ -136,23 +140,23 @@ const dof = computed(() => { - - + + - + - - + + - - + + - + @@ -170,7 +174,7 @@ const dof = computed(() => { :y2="focal.s.y + aov.innerBottom.y"> - + diff --git a/src/SVG/SVG.vue b/src/SVG/SVG.vue index 2b7bbad..03a38c9 100644 --- a/src/SVG/SVG.vue +++ b/src/SVG/SVG.vue @@ -1,7 +1,7 @@