Last active
June 2, 2024 09:01
-
-
Save kboomska/6299d8408a4626357c2c1a77af05a459 to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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)}'); | |
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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