我想为我认识的Minecraft玩家创建一个省略号。我有一个 dart 类:
class Ellipse with EquatableMixin implements Comparable<Ellipse> {
const Ellipse(this.width, this.depth) : assert((width > 0) && (depth > 0));
final int width;
final int depth;
@override
int compareTo(Ellipse other) {
final widthResult = width.compareTo(other.width);
if (widthResult != 0) return widthResult;
return depth.compareTo(other.depth);
}
List<List<bool>> get blocks {
final blocks = List.generate(depth, (_) => List.filled(width, false));
final a = width / 2.0; // Semi-major axis
final b = depth / 2.0; // Semi-minor axis
final centerX = a;
final centerY = b;
for (int x = 0; x < width; x++) {
for (int y = 0; y < depth; y++) {
final normalizedX = (x - centerX) / a;
final normalizedY = (y - centerY) / b;
if ((normalizedX * normalizedX) + (normalizedY * normalizedY) <= 1) {
blocks[y][x] = true;
blocks[depth - y - 1][x] = true; // Ensure vertical symmetry
blocks[y][width - x - 1] = true; // Ensure horizontal symmetry
blocks[depth - y - 1][width - x - 1] =
true; // Ensure both horizontal and vertical symmetry
}
}
}
return blocks;
}
@override
List<Object?> get props => [width, depth];
}
字符串
我想到了在屏幕上绘制网格视图。
我的问题是,这段代码是绘制:(8,10,10,10,10,10,10,10,10,8)列/行(对称),但我想要更“四舍五入”的东西,比如(4,6,8,10,10,10,8,6,4)。
有人能帮我做数学题吗?
1条答案
按热度按时间i2byvkas1#
理念
我可能会做的是,使用椭圆上的点的公式:
字符串
https://en.wikipedia.org/wiki/Ellipse
其中
width = 2a
和height = 2b
然后,对于网格中的每个单元格,可以计算
x^2/a^2 + y^2/b^2
,看看它偏离1多少,并使用它来确定是否应该在这个位置有一个块。例如,假设您有一个5x 5的网格,公式为
型
示例
例如,我很快写了下面的脚本(作为灵感,玩!)
型
其中,对于给定的参数,输出一个漂亮的圆(如果字符是正方形):
型
推荐
你可以随意使用参数,值的阈值应该取决于width和height参数。圆现在以0,0为中心,这就是为什么for循环变得有点混乱,所以你也可以看看是否可以移动公式。