float x1, x2, x3, y1, y2, y3, l1, l2, angle;
float[] v3, v4;
float epsilon = 25; // 定义一个很小的容差值
void setup() {
size(600, 600);
background(0);
stroke(255);
strokeWeight(1);
noFill();
x1 = 500;
y1 = 100;
angle = radians(235);
}
float l=400;//总轨迹长度
float t=200;//持续时间
float t1=2;//间隔时间(持续时间的倍数)
float l3=200;//线段长度
Transition transition1 = new Transition(0, l, t, t1); // 3秒的过渡
Transition transition2 = new Transition(0, l, t, t1);
void draw() {
background(0);
// 计算终点坐标
//l1 = transitionValue(0, l3, t);//线段长度
v4 = transition2.getValue();//总轨迹长度
l2 = v4[0];
//不要用ifelse,会导致跳过某个if。
if (l2 < l3) {
l1 = 0;
}
if (abs(l2 - l3) < epsilon) { // 使用容差值进行比较
transition1.reset();
v3 = transition1.getValue();
l1 = v3[0];
}
if (l2 > l3) {
v3 = transition1.getValue();
l1 = v3[0];
}
x2 = x1 + l1 * cos(angle);
y2 = y1 - l1 * sin(angle);
x3 = x1 + l2 * cos(angle);
y3 = y1 - l2 * sin(angle);
if (v3 != null && v3.length > 1 && v3[1] < 1 || v4[1]<1) {
line(x2, y2, x3, y3);
}
}
class Transition {
private long startTime = -1;
private float startValue;
private float endValue;
private float duration;
private float tt;
// 构造函数初始化起始值、结束值和持续时间,间隔时间(是持续时间的几倍就输入几)
Transition(float startValue, float endValue, float duration, float tt) {
this.startValue = startValue;
this.endValue = endValue;
this.duration = duration;
this.tt = tt;
}
// 开始或重置计时器的方法
void reset() {
startTime = millis();
}
// 获取当前插值的方法
float[] getValue() {
if (startTime == -1) {
reset(); // 第一次调用时设置开始时间
}
float t = (millis() - startTime) / duration;
float v1, v2;
if (t <= 1) {
v1= lerp(startValue, endValue, t);
v2=t;
} else if ((t>1) && (t<1+tt)) {
v1= endValue;
v2=t;
} else {
startTime = -1; // 重置开始时间以便下次调用时重新开始计时
v1= endValue;
v2=t;
}
// 返回包含两个值的数组
return new float[]{v1, v2};
}
}
很简单的效果,不知为何居然写了这么长的代码。应该还有更简单的方法吧。感谢ai教我用类。这是我第一次用类。用ps做的gif不知为何很慢。找了个在线工具ezgif做了一下速度才正常。
接下来挑战流星雨!