final double cx = (pre.x + cur.x) / 2;
final double cy = (pre.y + cur.y) / 2;
// 곡선 그리기
path.quadraticBezierTo(pre.x, pre.y, cx, cy);
// 2차 베지어 곡선 수식 (곡선)
double getQuadValue(double p0, double p1, double p2, double t) {
return (1 - t) * (1 - t) * p0 + 2 * (1 - t) * t * p1 + t * t * p2;
}
// 2차 베지어 곡선 수식 (직선)
double quadTangent(double a, double b, double c, double t) {
return 2 * (1 - t) * (b - a) + 2 * (c - b) * t;
}
// 각도 구하기
final tx = quadTangent(x1, x2, x3, t);
final ty = quadTangent(y1, y2, y3, t);
final double rotation = atan2(ty, tx);
// 원 좌표 가져오기
Point getCirclePoint({required double t}) {
final double theta = pi * 2 * t;
return Point(cos(theta) * radius, sin(theta) * radius);
}
const double gap = 1 / total;
// 포인트 세팅
for (int i = 0; i < total; i++) {
final Point point = getCirclePoint(t: gap * i);
originPoints.add(point);
}
// element 얕은 복사를 위해
points = originPoints.map((e) => Point(e.x, e.y)).toList();
// 포인트 랜덤 변경
List<Point> updatePoints() {
for (int i = 1; i < total; i++) {
final Point p = originPoints[i];
points[i].x = p.x + Random().nextInt(sunVariable);
points[i].y = p.y + Random().nextInt(sunVariable);
}
return points;
}
Timer.periodic(
$style.times.ms33, // 30fps
(_) {
updatePoints();
update();
},
);
그동안 개발 자체보다는 비즈니스에 중점을 뒀다. 개발은 문제를 해결하기 위한 수단이라 생각해 쉽고 빠르게 프로덕트를 만들어내는 것에 집중했다.
하지만 여러 서비스를 만들며 느낀 점 "기술 없이 나오는 서비스는 큰 밸류를 만들어내기 어렵다."과 무서운 속도로 발전하는 AI는 특별한 성장 방법을 찾게 만들었다.
그러던 중 Interactive 개발자의 영상을 접했다. 컴퓨터 기술로 표현하고자 하는 것을 멋지게 해내는 것이 내겐 신선한 충격이었다. "나도 저렇게 할 수 있을까?"라는 도전의식을 불태우게 되는 계기가 되었다.
그래서 시작한 프로젝트가 "양들의 언덕"이다. Interactive 개발자가 javascript로 만든 영상을 보며 Flutter로 만들었다. 핵심 기능과 개념이 소개가 되어있어서 크게 어렵지 않게 만들 수 있었다. 라고 하고 싶지만, 꼬박 5일 동안 작업을 했다.
방법이 나와있는 데 오래 걸린 이유는 모든 코드와 수식을 이해하고 싶었기 때문이다.
등 많은 궁금증이 있었다. 성장하기 위해 스스로 질문하고 답을 찾아가는 과정이었다. 단순히 클론 코딩이 아니라 문제를 찾아 해결했다. (상태관리, 스크린 사이즈에 따라 속도가 달라지는 기능 등)
이번 프로젝트를 통해 얻은 게 몇 가지 있다.
당분간은 Interactive 개발 공부를 할 생각이다. Flutter 스페셜리스트가 되려면 상상 가능한 모든 UI를 그릴 수 있어야 한다.
해당 프로젝트는 Interactive Developer님의 영상을 참고했습니다.
https://www.youtube.com/watch?v=hCHL7sydzn0&t=233s