공부방/Flutter
Flutter 그려진 모든 원들이 연결 되도록 만들기 (Make all drawn circles connect)
soycrab
2023. 6. 23. 17:35
그려진 모든 원들은 서로 연결 될수 있게 만들어진 코드이다.
가작 작은원을 child Node라 할때 바로 위의 부모가 가지는 child node 의 개수에 따라
다양한 모양이 나온다.
chil node 노드 개수에 따른 모양은 아래와 같다.
1. child node = 1
2. child node = 2
3. child node = 3
4. child node = 4
5. child node = 5
6. child node = 6
7. child node = 7
8. child node = 8
9. child node = 9
10. child node = 10
11. child node = 11
11. child node = 15
11. child node = 30
child node의 개수가 늘어날수록 점점 원이 되어간다.
그리고 이제 숫자를 더 높이면 폰이 멈춘다.....
도형 코드
import 'dart:math';
import 'package:flutter/material.dart';
class BubbleTree extends StatelessWidget {
@override
Widget build(BuildContext context) {
return Container(
color: Colors.white,
child: LayoutBuilder(
builder: (context, constraints) {
return CustomPaint(
painter: BubbleTreePainter(constraints: constraints),
);
},
),
);
}
}
class BubbleTreePainter extends CustomPainter {
static const childNode = 30;
final BoxConstraints constraints;
BubbleTreePainter({required this.constraints});
@override
void paint(Canvas canvas, Size size) {
double radius = constraints.maxWidth/5;
Offset center = Offset(constraints.maxWidth/2 ,constraints.maxHeight/2);
Paint bubblePaint = Paint()
..color = Colors.blue
..style = PaintingStyle.stroke
..strokeWidth = 2.0;
drawBubble(canvas, center, radius, bubblePaint);
}
void drawBubble(Canvas canvas, Offset center, double radius, Paint paint) {
canvas.drawCircle(center, radius, paint);
if (radius > 10) {
double childRadius = radius / 2;
double angle = 0.0;
double increment = 2 * 3.14159 / childNode; // 4개의 자식 노드를 가정
for (int i = 0; i < childNode; i++) {
double childCenterX = center.dx + radius * cos(angle);
double childCenterY = center.dy + radius * sin(angle);
Offset childCenter = Offset(childCenterX, childCenterY);
drawBubble(canvas, childCenter, childRadius, paint);
angle += increment;
}
}
}
@override
bool shouldRepaint(CustomPainter oldDelegate) {
return true;
}
}
반응형