|
|
@@ -1,6 +1,11 @@
|
|
|
package space.anyi.render;
|
|
|
|
|
|
import space.anyi.render.core.Render;
|
|
|
+import space.anyi.render.utils.PPMUtil;
|
|
|
+
|
|
|
+import java.util.concurrent.ExecutorService;
|
|
|
+import java.util.concurrent.Executors;
|
|
|
+import java.util.concurrent.atomic.AtomicInteger;
|
|
|
|
|
|
/**
|
|
|
* @ProjectName: render
|
|
|
@@ -15,6 +20,9 @@ import space.anyi.render.core.Render;
|
|
|
* vec2 p=(FC.xy*2.-r)/r.y,l,v=p*(1.-(l+=abs(.7-dot(p,p))))/.2;for(float i;i++<8.;o+=(sin(v.xyyx)+1.)*abs(v.x-v.y)*.2)v+=cos(v.yx*i+vec2(0,i)+t)/i+.7;o=tanh(exp(p.y*vec4(1,-1,-2,0))*exp(-4.*l.x)/o);
|
|
|
*/
|
|
|
public class First extends Render {
|
|
|
+ private static ExecutorService fixedThreadPool = Executors.newFixedThreadPool(6);
|
|
|
+ private AtomicInteger count;
|
|
|
+
|
|
|
public First() {
|
|
|
super();
|
|
|
}
|
|
|
@@ -98,4 +106,41 @@ public class First extends Render {
|
|
|
|
|
|
return imageData;
|
|
|
}
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public void render() {
|
|
|
+ int width = getWidth();
|
|
|
+ int height = getHeight();
|
|
|
+ int fps = getFps();
|
|
|
+ int duration = getDuration();
|
|
|
+ int totalFrames = getTotalFrames();
|
|
|
+ String outputDir = getOutputDir();
|
|
|
+ System.out.println("开始生成分形动画...");
|
|
|
+ System.out.println("分辨率: " + width + "x" + height);
|
|
|
+ System.out.println("帧率: " + fps + " Hz");
|
|
|
+ System.out.println("时长: " + duration + " 秒");
|
|
|
+ System.out.println("总帧数: " + totalFrames);
|
|
|
+ System.out.println("输出目录: " + outputDir);
|
|
|
+ PPMUtil.createDirectory(outputDir);
|
|
|
+ count = new AtomicInteger(0);
|
|
|
+ for (int frame = 0; frame < totalFrames; frame++) {
|
|
|
+ float time = frame / (float) fps; // 计算当前时间(秒)
|
|
|
+ final int tempFrame = frame;
|
|
|
+ fixedThreadPool.execute(()->{
|
|
|
+ float[] imageData = generateFrame(width, height, time);
|
|
|
+ PPMUtil.saveAsPPM(imageData, width, height, outputDir + "/frame_" + String.format("%05d", tempFrame) + ".ppm");
|
|
|
+ myNotify();
|
|
|
+ });
|
|
|
+ }
|
|
|
+ }
|
|
|
+ private void myNotify() {
|
|
|
+ int frame = count.incrementAndGet();
|
|
|
+ int totalFrames = getTotalFrames();
|
|
|
+ // 显示进度
|
|
|
+ double progress = (frame + 1) * 100.0 / totalFrames;
|
|
|
+ System.out.printf("进度: %.1f%% (帧 %d/%d)%n", progress, frame + 1, totalFrames);
|
|
|
+ if (frame >= totalFrames) {
|
|
|
+ fixedThreadPool.shutdown();
|
|
|
+ }
|
|
|
+ }
|
|
|
}
|