Jelajahi Sumber

better video

Nicolas Winkler 5 tahun lalu
induk
melakukan
904a5ae3a5
2 mengubah file dengan 31 tambahan dan 21 penghapusan
  1. 29 19
      libalmond/src/MandelVideoGenerator.cpp
  2. 2 2
      mandelvid/src/main.cpp

+ 29 - 19
libalmond/src/MandelVideoGenerator.cpp

@@ -44,24 +44,31 @@ void MandelVideoGenerator::generate(void)
     mi.bHeight = evi.height * oversizeFactor;
     mi.maxIter = evi.maxIterations;
 
+    bool first = true;
 
     while(w > evi.end.width || h > evi.end.height) {
 
         if (bigW > sqrt(oversizeFactor) * w) {
             mi.view = mnd::MandelViewport{ x - w/2, y - h/2, w, h };
-            //Bitmap<float> raw{ evi.width * oversizeFactor, evi.height * oversizeFactor };
+            Bitmap<float> raw{ evi.width * oversizeFactor, evi.height * oversizeFactor };
             Bitmap<float> rawSmall{ evi.width * oversizeFactor, evi.height * oversizeFactor };
-            //gen.generate(mi, raw.pixels.get());
-            mi.view.zoomCenter(1.0f / sqrt(oversizeFactor));
+            mi.view.zoomCenter(oversizeFactor);
             gen.generate(mi, rawSmall.pixels.get());
+            //mi.view.zoomCenter(sqrt(oversizeFactor));
+            //gen.generate(mi, raw.pixels.get());
             //auto before = std::chrono::high_resolution_clock::now();
-            /*big = raw.map<RGBColor>([&mi, this] (float i) {
-                return i >= mi.maxIter ? RGBColor{ 0, 0, 0 } : evi.gradient.get(i);
-            });*/
+            if (first) {
+                mi.view.zoomCenter(sqrt(oversizeFactor));
+                gen.generate(mi, raw.pixels.get());
+                small = raw.map<RGBColor>([&mi, this] (float i) {
+                    return i >= mi.maxIter ? RGBColor{ 0, 0, 0 } : evi.gradient.get(i);
+                });
+            }
             big = std::move(small);
-            small = raw.map<RGBColor>([&mi, this] (float i) {
+            small = rawSmall.map<RGBColor>([&mi, this] (float i) {
                 return i >= mi.maxIter ? RGBColor{ 0, 0, 0 } : evi.gradient.get(i);
             });
+            printf("recalced\n");
             /*mi.view.zoomCenter(0.5);
             gen.generate(mi, raw.pixels.get());
             small = raw.map<RGBColor>([] (float x) { return
@@ -69,6 +76,7 @@ void MandelVideoGenerator::generate(void)
             });*/
             bigW = w;
             bigFac = 1.0;
+            first = false;
         }
 
         vs.addFrame(overlay(big, small, evi.width, evi.height, bigFac, sqrt(oversizeFactor)));
@@ -170,16 +178,18 @@ Bitmap<RGBColor> MandelVideoGenerator::overlay(const Bitmap<RGBColor>& outer,
     printf("%lf\n", scale);
     Bitmap<RGBColor> ret{ bw, bh };
 
-    double outerLeft = outer.width * (1 - scale) / 2;
-    double outerTop = outer.height * (1 - scale) / 2;
-    double outerWidth = outer.width * scale;
-    double outerHeight = outer.height * scale;
+    double outerLeft = outer.width * (1 - scale / oversizeFactor / oversizeFactor) / 2;
+    double outerTop = outer.height * (1 - scale / oversizeFactor / oversizeFactor) / 2;
+    double outerWidth = outer.width * scale / oversizeFactor / oversizeFactor;
+    double outerHeight = outer.height * scale / oversizeFactor / oversizeFactor;
 
-    double innerLeft = outer.width * (1 - scale * oversizeFactor) / 2;
-    double innerTop = outer.height * (1 - scale * oversizeFactor) / 2;
-    double innerWidth = outer.width * scale * oversizeFactor;
-    double innerHeight = outer.height * scale * oversizeFactor;
+    double innerLeft = outer.width * (1 - scale / oversizeFactor) / 2;
+    double innerTop = outer.height * (1 - scale / oversizeFactor) / 2;
+    double innerWidth = outer.width * scale / oversizeFactor;
+    double innerHeight = outer.height * scale / oversizeFactor;
 
+            double lerpVal = ::log(1.0 / scale) / ::log(oversizeFactor);
+            printf("lerpval: %f\n", lerpVal);
     auto before = std::chrono::high_resolution_clock::now();
 #pragma omp parallel for schedule(static, 1)
     for (int i = 0; i < ret.height; i++) {
@@ -191,13 +201,13 @@ Bitmap<RGBColor> MandelVideoGenerator::overlay(const Bitmap<RGBColor>& outer,
             double innJ = innerLeft + innerWidth * j / ret.width;
             double innI = innerTop + innerHeight * i / ret.height;
             RGBColor b = biliniear(inner, innJ, innI);
-            double lerpVal = ::log(1.0 / scale) / ::log(oversizeFactor) / 2;
-            RGBColor lerped = lerpColors(a, b, lerpVal);
-            ret.get(j, i) = b;
+            double lerpVal = -::log(scale) / ::log(oversizeFactor);
+            RGBColor lerped = lerpColors(b, a, lerpVal);
+            ret.get(j, i) = lerped;
         }
     }
     auto after = std::chrono::high_resolution_clock::now();
-    printf("gradient applied in: %lld microseconds\n", std::chrono::duration_cast<std::chrono::microseconds>(after - before).count());
+    //printf("gradient applied in: %lld microseconds\n", std::chrono::duration_cast<std::chrono::microseconds>(after - before).count());
     fflush(stdout);
     /*for (int i = 0; i < ret.height * ret.width; i++) {
         ret.pixels[i] = outer.pixels[i];

+ 2 - 2
mandelvid/src/main.cpp

@@ -14,8 +14,8 @@ int main() {
     evi.end = mnd::MandelViewport {
         mnd::Real("-1.5016327722130767973008541252724123393337183519056236025189105693015282429244791506194548898968185999262221668435271537932672968559900159142085320685031"),
         mnd::Real("9.1949171527697821768939276268368163504538591789778359909730511642378316080598664365235178721745031546786105261407973733873085119833457073054327967448264e-06"),
-        mnd::Real("1.6236294899543021550377844129369984149698872979955210084321757728274664401182171658849308001321609757279087031477100527629814577654596624031152718524352e-28"),
-        mnd::Real("1.2246019034401093377903721086780361028058704962292211685926779200766324399350798858672587301860274703389823933260119617558370004128301410779021141722617e-28")
+        mnd::Real("1.6236294899543021550377844129369984149698872979955210084321757728274664401182171658849308001321609757279087031477100527629814577654596624031152718524352e-10"),
+        mnd::Real("1.2246019034401093377903721086780361028058704962292211685926779200766324399350798858672587301860274703389823933260119617558370004128301410779021141722617e-10")
     };
     //evi.end.zoomCenter(1.0e+27);
     evi.gradient = Gradient::defaultGradient();