Skip to content

Instantly share code, notes, and snippets.

@kboomska
Last active June 2, 2024 09:01
Show Gist options
  • Save kboomska/6299d8408a4626357c2c1a77af05a459 to your computer and use it in GitHub Desktop.
Save kboomska/6299d8408a4626357c2c1a77af05a459 to your computer and use it in GitHub Desktop.
import 'package:octagonal_bump_calculation/octagonal_bump_calculation_methods.dart';
void main(List<String> arguments) {
/// Расчет координат вершин октогональных бампов диаметром 60um.
/// Диаметр вложенной окружности слоя APLA (83;0).
final alpaDiameter60 = 71.11;
/// Отступ от BORDER (127;0) слоя.
final alpaPadding60 = 0.0;
/// Диаметр вложенной окружности слоя BUMP (168;0).
final bumpDiameter60 = 60.0;
/// Отступ от ALPA (83;0) слоя.
final bumpPadding60 = 5.555 + alpaPadding60;
/// Диаметр вложенной окружности слоя MD (130;0).
final mdDiameter60 = 48.89;
/// Отступ от ALPA (83;0) слоя.
final mdPadding60 = 11.11 + alpaPadding60;
/// Диаметр вложенной окружности слоя PI (82;0).
final piDiameter60 = 33.33;
/// Отступ от MD (130;0) слоя.
final piPadding60 = 7.78 + mdPadding60;
print('Bump diameter 60um');
print('ALPA: ${calculatePoints(alpaDiameter60, alpaPadding60)}');
print('BUMP: ${calculatePoints(bumpDiameter60, bumpPadding60)}');
print('MD: ${calculatePoints(mdDiameter60, mdPadding60)}');
print('PI: ${calculatePoints(piDiameter60, piPadding60)}');
/// Расчет координат вершин октогональных бампов диаметром 75um.
/// Диаметр вложенной окружности слоя APLA (83;0).
final alpaDiameter75 = 86.2;
/// Отступ от BORDER (127;0) слоя.
final alpaPadding75 = 0.0;
/// Диаметр вложенной окружности слоя BUMP (168;0).
final bumpDiameter75 = 75.0;
/// Отступ от ALPA (83;0) слоя.
final bumpPadding75 = 5.6 + alpaPadding75;
/// Диаметр вложенной окружности слоя MD (130;0).
final mdDiameter75 = 63.8;
/// Отступ от ALPA (83;0) слоя.
final mdPadding75 = 11.2 + alpaPadding75;
/// Диаметр вложенной окружности слоя PI (82;0).
final piDiameter75 = 48.2;
/// Отступ от MD (130;0) слоя.
final piPadding75 = 7.8 + mdPadding75;
print('Bump diameter 75um');
print('ALPA: ${calculatePoints(alpaDiameter75, alpaPadding75)}');
print('BUMP: ${calculatePoints(bumpDiameter75, bumpPadding75)}');
print('MD: ${calculatePoints(mdDiameter75, mdPadding75)}');
print('PI: ${calculatePoints(piDiameter75, piPadding75)}');
/// Расчет координат вершин октогональных бампов диаметром 100um.
/// Диаметр вложенной окружности слоя APLA (83;0).
final alpaDiameter100 = 112.0;
/// Отступ от BORDER (127;0) слоя.
final alpaPadding100 = 0.0;
/// Диаметр вложенной окружности слоя BUMP (168;0).
final bumpDiameter100 = 100.0;
/// Отступ от ALPA (83;0) слоя.
final bumpPadding100 = 6.0 + alpaPadding100;
/// Диаметр вложенной окружности слоя MD (130;0).
final mdDiameter100 = 88.0;
/// Отступ от ALPA (83;0) слоя.
final mdPadding100 = 12.0 + alpaPadding100;
/// Диаметр вложенной окружности слоя PI (82;0).
final piDiameter100 = 72.0;
/// Отступ от MD (130;0) слоя.
final piPadding100 = 8.0 + mdPadding100;
print('Bump diameter 100um');
print('ALPA: ${calculatePoints(alpaDiameter100, alpaPadding100)}');
print('BUMP: ${calculatePoints(bumpDiameter100, bumpPadding100)}');
print('MD: ${calculatePoints(mdDiameter100, mdPadding100)}');
print('PI: ${calculatePoints(piDiameter100, piPadding100)}');
}
import 'dart:math';
/// Расчет длины стороны восьмиугольника.
///
/// Вычисляемая длина округляется в большую сторону, т.к. должна
/// соответствовать сетке дизайна в САПР. Таким образом, ортогональные
/// стороны восьмиугольника становятся чуть длиннее диагональных сторон
/// в угоду соответствия сетке. Восьмиугольник не является идеальным, но
/// продолжает соответствовать заданному диаметру вписанной окружности.
double calculateSide(double diameter, {int precision = 2}) {
// Вычисление длины стороны для идеального восьмиугольника.
final side = diameter * tan(pi / 8);
// Коэффициент позволяет устанавливать точность для округления вверх.
final factor = pow(10, precision);
// Идея в получении значения с двумя знаками после запятой и округлением
// всегда в большую сторону.
final orthogonalSide = (side * factor).ceilToDouble() / factor;
return orthogonalSide;
}
/// Вычисление координат вершин восьмиугольника.
///
/// Для соответствия сетке дизайна в САПР ортогональные стороны восьмиугольника
/// рассчитываются чуть длиннее диагональных сторон. Восьмиугольник не является
/// идеальным, но продолжает соответствовать заданному диаметру вписанной
/// окружности.
///
/// Координаты вычисляются с учетом отступа рассчитываемого восьмиугольника от
/// внешней описанной фигуры.
String calculatePoints(double diameter, double padding, {int precision = 2}) {
// Ортогональная сторона восьмиугольника.
final side = calculateSide(diameter);
// Проекция на одну из ортогональных осей длины диагональной стороны
// восьмиугольника. Можно представить как расстояние между ближайшими точками
// соседних ортогональных сторон восьмиугольника, отложенное по одной из осей.
final projection = (diameter - side) / 2;
// Рассчет удаленности точки от оси с учетом отступов.
final nearest = padding;
// Рассчет удаленности точки от оси с учетом отступов.
final postNearest = projection + nearest;
// Рассчет удаленности точки от оси с учетом отступов.
final preDistant = side + postNearest;
// Рассчет удаленности точки от оси с учетом отступов.
final distant = projection + preDistant;
// South-southwest (SSW).
final ssw = '($postNearest $nearest)';
// South-southeast (SSE).
final sse = '($preDistant $nearest)';
// East-southeast (ESE).
final ese = '($distant $postNearest)';
// East-northeast (ENE).
final ene = '($distant $preDistant)';
// North-northeast (NNE).
final nne = '($preDistant $distant)';
// North-northwest (NNW).
final nnw = '($postNearest $distant)';
// West-northwest (WNW).
final wnw = '($nearest $preDistant)';
// West-southwest (WSW).
final wsw = '($nearest $postNearest)';
return ssw + sse + ese + ene + nne + nnw + wnw + wsw;
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment