signFromSymbols function

Sign signFromSymbols(
  1. List<SignSymbol> symbols, {
  2. bool fixX = true,
  3. bool fixY = true,
})

Builds a Sign from a list of symbols, computing a tight box centered on (500, 500) from the symbols' rendered sizes and repositioning the symbols into that reference frame.

When fixX / fixY is false the corresponding axis is left untouched (used by the directional joins, which fix only the joining axis).

Mirrors Python signwriting.utils.join_signs.sign_from_symbols.

Implementation

Sign signFromSymbols(List<SignSymbol> symbols,
    {bool fixX = true, bool fixY = true}) {
  int minX = 999;
  int minY = 999;
  int maxX = 0;
  int maxY = 0;
  for (final symbol in symbols) {
    minX = min(minX, symbol.position.item1);
    minY = min(minY, symbol.position.item2);
    final size = getSymbolSize(symbol.symbol);
    maxX = max(maxX, symbol.position.item1 + size.item1);
    maxY = max(maxY, symbol.position.item2 + size.item2);
  }

  final boxX = 500 + (maxX - minX) ~/ 2;
  final boxY = 500 + (maxY - minY) ~/ 2;
  final sizeX = maxX - minX;
  final sizeY = maxY - minY;

  final newSymbols = <SignSymbol>[];
  for (final symbol in symbols) {
    int x = symbol.position.item1;
    int y = symbol.position.item2;
    if (fixX) x += boxX - minX - sizeX;
    if (fixY) y += boxY - minY - sizeY;
    newSymbols.add(SignSymbol(symbol: symbol.symbol, position: Tuple2(x, y)));
  }

  return Sign(
    box: SignSymbol(symbol: 'M', position: Tuple2(boxX, boxY)),
    symbols: newSymbols,
  );
}