Dart中的省略号绘图

7gcisfzg  于 2023-11-14  发布在  其他
关注(0)|答案(1)|浏览(99)

我想为我认识的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)。
有人能帮我做数学题吗?

i2byvkas

i2byvkas1#

理念

我可能会做的是,使用椭圆上的点的公式:

x^2/a^2 + y^2/b^2 = 1

字符串
https://en.wikipedia.org/wiki/Ellipse
其中width = 2aheight = 2b
然后,对于网格中的每个单元格,可以计算x^2/a^2 + y^2/b^2,看看它偏离1多少,并使用它来确定是否应该在这个位置有一个块。
例如,假设您有一个5x 5的网格,公式为

x^2/6.25 + y^2/6.25 = 1

示例

例如,我很快写了下面的脚本(作为灵感,玩!)

import 'dart:math';

void main() {
  int width = 6;
  int height = 6;
  double treshold = 0.2;

  for (int x = (-width/2).round(); x <= (width/2).round(); x++) {
    String row = '';
    for (int y = (-height/2).round(); y <= (height/2).round(); y++) {
      double value = pow(x, 2)/pow(width/2, 2) + pow(y, 2)/pow(height/2, 2);
      row += '${(value - 1).abs() < treshold ? 'O' : ' '}';
    }
    print(row);
  }
}


其中,对于给定的参数,输出一个漂亮的圆(如果字符是正方形):

OOO  
 O   O 
O     O
O     O
O     O
 O   O 
  OOO

推荐

你可以随意使用参数,值的阈值应该取决于width和height参数。圆现在以0,0为中心,这就是为什么for循环变得有点混乱,所以你也可以看看是否可以移动公式。

相关问题