depths писал(а):А по какой формуле вы считали? Для чего вам площадь и плотность?
Площадь S - это размеры "пространства", в котором мы пытаемся расположить наши шары,
Плотность Ps - это КПД использования этой площади нашими шарами.
Это не нужная информация. Важная информация - сила Fs от всех вместившихся шаров, и Fп создаваемая периметром.
вот текс программы:
Let st = 2
- это расстояние между шарами
Let stx = st
Let sty = st * Cos(3.1415927 / 180 * 30)
- при горизонтальной упаковке это расстояние для осей X и Y. При вертикальной упаковке значения по осям меняются местами.
For a = 0 To 20
- циклическая последовательность от 0 до 20 ряда. 0 - это в "пространстве" располагается только наш шар. 1 и более - это ряды шаров вокруг него.
Let f1 = 0
Let m = 0
Let x = st * a
Let y = st * a
Let s = x * y * 2
- f1 это сила со всего "пространства",
- m это масса, то есть кол-во уместившихся шаров,
- x и y крайние координаты "пространства", в которые необходимо уложить шары,
- s это площадь "пространства".
For b = 0 To 150
- рассмотрим расположение шаров в "пространстве" с запасом по оси "y"(вертикальной) 150 штук.
If b / 2 = Int(b / 2) Then Let smx = 0 Else Let smx = 1
- если ряд не четный, то учтем смещение на пол шара для оси X.
Let Y1 = b * sty
- координата расположения шара по оси Y.
If Y1 <= y Then
- продолжим расчет, если шар имеет координату по оси Y в пределах заданной нами площади. В противном случае его игнорируем.
For c = -150 To 150
- рассмотрим все шары от -150 до +150 штук от нашего шара в обе стороны по оси X(горизонтально).
Let X1 = c * stx + smx
- X1 это координата расположения шара по оси X, с учетом смещения для не четных рядов.
If X1 >= -x And X1 <= x Then
- продолжим расчет, если шар по оси X находится внутри заданного нами "пространства". В противном случае его игнорируем.
For d = 1 To 9
Circle (X1 * 10 + 700, 800 - Y1 * 10), d, RGB(128, 128, 128)
Next
Circle (X1 * 10 + 700, 800 - Y1 * 10), 10
- блок программы, создающий на экране рисунок рассматриваемого нами в данный момент шара.
Let m = m + 1
- увеличиваем массу нашего "пространства" еще на один шар.
Let r = Sqr(X1 ^ 2 + Y1 ^ 2)
- вычисляем расстояние до него. Наш красный шар располагается в начале координат X = 0, Y = 0.
If r > 0 Then Let f = Y1 / r / r ^ 2 Else Let f = 0
- если расстояние больше нуля (то есть данный шар не является нашим красным), то вычисляем силу взаимодействия с нашим шаром, с учетом угла отклонения силы от вертикальной оси. "Y1 / r" - это косинус угла отклонения, a "/ r ^ 2" - это квадрат расстояния до него.
Let f1 = f1 + f
- добавляем силу от данного шара в общую копилку сил.
End If
Next c
- окончание для блока проверки по оси X и его цикла.
End If
Next b
- окончание для блока проверки по оси Y и его цикла.
If s > 0 Then Let p = Int(1000 * m / s) / 1000 Else Let p = 0
- если площадь "пространства" больше нуля, то вычисляем плотность упаковки ее шарами, с точностью 3 знака после запятой. В противном случае она равна 0.
Let f2 = f1 - f1old
- вычисляем силу шаров, находящихся в периметре данного ряда, вычитая из силы всей площади данного ряда, силу площади от ряда предыдущего.
Let s1 = s - sold
- вычисляем площадь периметра по той же схеме, что и силу периметра, вычитая из данной площади предыдущую площадь.
Let f1old = f1
Let sold = s1
- запоминаем силу и площадь с данного ряда, для использования её как предыдущую в следующем расчете.
Let f1 = Int(100000 * f1) / 100000
Let f2 = Int(100000 * f2) / 100000
- округляем силу с площади, и силу с периметра до 5 знака после запятой, для более удобного вывода на экран. Для следующих расчетов она остается не округленной, имея полное значение.
Print #1, "ðÿäîâ"; Str(a), ", S ="; Str(s), ", Ms ="; Str(m), ", Ps ="; Str(p), ", Fs ="; Str(f1), ", Fï ="; Str(f2), ", Sï ="; Str(s1)
- сохраняем результаты расчета в файл.
Next a
- переходим к рассмотрению следующего ряда.
PS при рассмотрении вертикальной упаковки, после горизонтальной, при квадратном "пространстве" координаты шаров по осям X и Y меняются местами, с учетом их смещения на пол шара из-за четности рядов.
при рассмотрении круглого "пространства" вместо сравнения координат X и Y используются расстояние до них, то есть радиус обзора круга. Соответственно так же с вертикальным и горизонтальным заполнением шарами происходит то же самое, что и при квадратном, с учетом смещения.
Интереснее будет перейти к обьемным фигурам после плоских, с учетом разницы заполнения решётки ГЦК и ГП