Blender для начинающих/Python практика: различия между версиями

м
<source> -> <syntaxhighlight> (phab:T237267)
м (орфография)
м (<source> -> <syntaxhighlight> (phab:T237267))
 
=Алгебраические задачи=
==Перестановка значений переменных==
<sourcesyntaxhighlight lang="python">
def Swap(a, b):
a = a + b
b = a - b
a = a - b
</syntaxhighlight>
</source>
==Циклы==
Пусть, имеется переменная a, значение которой после цикла while надо узнать. Пусть, inc - число, на которое увеличивается a. B - переменная, задающая условие в цикле:
<sourcesyntaxhighlight lang="python">
while a знак B:
a = a + inc
</syntaxhighlight>
</source>
inc - независимая переменная. Значение a приближается к значению B.
# Если неравенство нестрогое, то после цикла a = a + inc*(abs(B - a) // inc + 1).
==Расположение точки на диагонали==
Пусть, имеется точка A(x, y), то будет или нет она располагается на диагонали, можно будет узнать так:
<sourcesyntaxhighlight lang="python">if math.fabs(x) == math.fabs(y):
print("Точка на диагонали")</sourcesyntaxhighlight>
math.fabs(x) возвращает модуль числа x.
 
==Точка находится под прямой==
Пусть, имеется точка A(x, y), где x, y - нецелые числа. Уравнение прямой '''y = kx + b'''. Функция, возвращающая y в зависимости от x:
<sourcesyntaxhighlight lang="python">def getY(x, k, b):
return k*x+b</sourcesyntaxhighlight>
Узнать ниже ли точка прямой или нет, можно, подставив ее x в уравнение прямой:
<sourcesyntaxhighlight lang="python">if y < getY(x, y, k):
print("Точка под прямой.")</sourcesyntaxhighlight>
 
==Точка на прямой==
Пусть, имеется точка A(x, y), где x, y - нецелые числа. Узнать на прямой ли точка или нет, можно, подставив ее x в уравнение прямой:
<sourcesyntaxhighlight lang="python">if y == getY(x, y, k):
print("Точка на прямой.")</sourcesyntaxhighlight>
==Точка над прямой==
Пусть, имеется точка A(x, y), где x, y - нецелые числа. Узнать выше прямой ли точка или нет, можно, подставив ее x в уравнение прямой:
<sourcesyntaxhighlight lang="python">if y > getY(x, y, k):
print("Точка над прямой.")</sourcesyntaxhighlight>
==Вычисление k перпендикулярной прямой==
Пусть, имеется точки A(x, y) и A(x2, y2), задающие прямые, где x, y - нецелые числа. То зная k первой прямой вычислить k для второй можно следующим образом:
<sourcesyntaxhighlight lang="python">import math
k2 = math.tan(math.atan(k)+90)
</syntaxhighlight>
</source>
==Вычисление координат точки пересечения прямых==
Пусть, прямые задаются такими уравнениями:
# x(k1 - k2) = b2 - b1
Следовательно, x = (b2 - b1)/(k1 - k2). Таким образом, узнать координаты точки пересечения прямых можно так:
<sourcesyntaxhighlight lang="python">
x = (b2 - b1)/(k1 - k2)
y = k1*x + b1 # Без разницы, в уравнение какой прямой подставлять.
</syntaxhighlight>
</source>
==Вычисление коэффициента наклона прямой==
Пусть, прямая проходит через две точки: A(x, y) и B(x1, y1). Причем, точка B лежит правее и выше точки A. Тогда вычисление коэффициента k для уравнения прямой будет выглядеть следующим образом:
<sourcesyntaxhighlight lang="python">
k = (y1 - y)/(x1 - x)
</syntaxhighlight>
</source>
 
=Столкновения=
==Окружность с окружностью==
Если расстояние между радиусами окружностей больше суммы их радиусов, то они не пересекаются:
<sourcesyntaxhighlight lang="python">
import math
if (math.sqrt((circle1.x - circle2.x)**2 + (circle1.y - circle2.y)**2) >= circle1.r + circle2.r):
print("Окружности не пересекаются.")
</syntaxhighlight>
</source>
Здесь circle1 и circle2 - окружности.
 
::::Отрезки не пересекаются.
Пусть, есть две точки, составляющих первый отрезок: A(x, y) и B(x1, y1). Пусть, есть две точки, составляющие второй отрезок: C(x2, y2) и D(x3, y3). Пусть, точки расположены по оси +X в таком порядке: A, B, C, D.
<sourcesyntaxhighlight lang="python">
if ((x1 >= x3) and (x1 <= x4)) or ((x >= x3) and (x <= x4)):
intersectX = (b2 - b1)/(k1 - k2)
else:
print('Отрезки не пересекаются.')
</syntaxhighlight>
</source>
Данная схема будет корректно работать лишь в том случае, если ни один из отрезков не перпендикулярен оси X.
 
[[File:Buttonsys.jpg|frameless]]<br>
Границей любой кнопки обычно является прямоугольник, поэтому проверка на принадлежность точки A(x, y) этому прямоугольнику можно задать следующим условием:
<sourcesyntaxhighlight lang="python">if (A.x >= button.x) and (A.y >= button.y) and (A.x <= button.x + button.width) and (A.y <= button.y + button.heigth):</sourcesyntaxhighlight>
# A.x - X координата точки
# A.y - Y координата точки
==Ползунки==
Любой ползунок представляет собой два прямоугольника. Первый - границы ползунка, второй - значение ползунка. Напишем функцию, которая определит лежит ли точка в границах первого прямоугольника «border»:
<sourcesyntaxhighlight lang="python">def intersect(A, border):
if (A.x >= border.x) and (A.y >= border.y) and (A.x <= border.x + border.width) and (A.y <= border.y + border.heigth):
return True
else:
return False</sourcesyntaxhighlight>
Пусть, Вы перемещайте ползунок, то код для обработки изменения значения ползунка будет следующий:
<sourcesyntaxhighlight lang="python">if cursor.x < border.x:
value.x = border.x
elif cursor.x > border.x + border.width:
value.x = border.x + border.width
else:
value.x = cursor.x</sourcesyntaxhighlight>
=Архитектура игровых классов=
При написании проекта следует определить будет ли он 2D или 3D игрой. С учетом этого, следует строить архетиктуру классов проекта.
==2D игры - пример архитектуры классов==
<sourcesyntaxhighlight lang="Python">class Object
# свойства
x_position, y_position, width, height, fill_color, border_color, border_width, filled, bordered
class Dynamic(Object)
# свойства
mass, radius</sourcesyntaxhighlight>
Здесь основные свойства объекта занесены в один класс «Object», так как их мало.
 
==3D игры - пример архитектуры==
Так как 3D игры - игры с более навороченной графикой, то было бы предпочтительнее использовать такую систему классов:
<sourcesyntaxhighlight lang="Python">class Material
# свойства
fill_color, border_color, border_width, filled, bordered</sourcesyntaxhighlight>
<sourcesyntaxhighlight lang="Python">class Object
# свойства
x_position, y_position, width, height
class Dynamic(Object)
# свойства
mass, radius</sourcesyntaxhighlight>
=Калькулятор=
Пусть, наш калькулятор поддерживает выражения вида a±b, a/b и a*b. Пусть, a, b € [0; 9]. Код калькулятора будет следующий:
<sourcesyntaxhighlight lang="python">
while True:
text = input()
else:
print("Недопустимая операция.")
</syntaxhighlight>
</source>
 
=Сортировки=
==Сортировка при помощи функций списков==
Самый неудачный, но возможный вариант сортировки представлен ниже:
<sourcesyntaxhighlight lang="python">
def SortList(a):
b = list()
a.remove(m)
return b
</syntaxhighlight>
</source>
Недостатки:
# Используется два списка.
# Проходим по списку несколько раз, чтобы правильно отсортировать все элементы в правильном порядке. Не всегда после n-ной итерации все элементы списка будут отсортированы.
# Сначала мы ищем минимальный элемент во всем списке, потом - в его оставшейся части.
<sourcesyntaxhighlight lang="python">
def SortList(a):
for i in range(0, len(a)):
a[j], a[j - 1] = a[j - 1], a[j]
return a
</syntaxhighlight>
</source>
<sourcesyntaxhighlight lang="python">
def SortList(a):
for i in range(len(a) - 1, -1):
a[j], a[j + 1] = a[j + 1], a[j]
return a
</syntaxhighlight>
</source>
[[File:Sort1.jpg|frameless]]
 
==Сортировка выбором==
[[File:Sort2e.jpg|frameless]]
<sourcesyntaxhighlight lang="python">
def SortList(a):
for i in range(0, len(a)):
a[i], a[j] = a[j], a[i]
return a
</syntaxhighlight>
</source>
# Переменные i и j изменяются в одном направлении - увеличиваются.
# Сравнивая с все элементы списка, стоящие после a[i], с a[i], мы находим минимум из множества значений (a[i], a[len(a)-1]]. При следующей итерации новый минимум будет искаться из оставшихся элементов, поэтому следующий минимум будет больше предыдущего минимума.
# Переменные i и j изменяются в разных направлениях.
# Осуществляем меньше итераций, чем в сортировке пузырьком, так как мы не проходим уже отсортированные пары элементов, поскольку отсортировали их на более ранних итерациях цикла for.
<sourcesyntaxhighlight lang="python">
def SortList(a):
for i in range(1, len(a)):
j -= 1
return a
</syntaxhighlight>
</source>
# В «range(1, len(a))» первым элементом множества значений установил 1, чтобы не проверять лишний раз условие «while j > 0 and a[j] < a[j - 1]».
# Условие «j > 0» требуется для того, чтобы предотвратить выход j - 1 за границы списка.
 
==Алгоритм создания множеств==
<sourcesyntaxhighlight lang="python">
def NewSet(a):
for i in range(0, len(a)):
j += 1
return a
</syntaxhighlight>
</source>
Пусть, мы должны сравнивать все элементы списка с a[j]. Из этого следует то, что не все элементы со значением a[j] были удалены. Но это противоречит тому, что написано в теле цикла:
<sourcesyntaxhighlight lang="python">
while j < len(a):
if a[j] == a[i]:
else:
j += 1
</syntaxhighlight>
</source>
Таким образом, мы должны сравнивать все элементы с a[i], стоящие после a[i].
 
=Другие алгоритмы=
==Разделение строки по символам==
<sourcesyntaxhighlight lang="python">
sym = []
sym.append(' ')
i += 1
wI += 1
</syntaxhighlight>
</source>
 
==Алгоритм нахождения НОК==
НОК - наибольший общий делитель чисел M и N.
<ol>
<li><sourcesyntaxhighlight lang="python">
def NOK(a, b):
while a != 0 and b != 0:
b = b % a
return a + b
</syntaxhighlight>
</source>
Выводим сумму, так не знаем в какой переменной именно хранится НОК. Значение одной из двух переменных после последней итерации будет равно 0.</li>
<li>Ниже используется правило «Если M>N, то НОД(М, N) = НОД(М - N, N)». Докажем правило. Пусть, K - один из общих делителей двух чисел, а m и n - числа, на которые умножается K, то M = mK, N = nK. Следовательно:
# M - N = mK - nK
# M - N = K(m - n)
<sourcesyntaxhighlight lang="python">
def NOK(a, b):
while a != b:
b = b - a
return a
</syntaxhighlight>
</source>
Выводим a, так как a == b после последней итерации цикла.</li>
</ol>
==Выборка элементов==
Пусть, a - список, состоящий из чисел. Следует выбрать только те числа, которые лежат в диапазонах: [1; 10], [21; 30] и т. д. Количество интервалов определяется переменной inters.
<sourcesyntaxhighlight lang="python">
def Get(a, inters):
for i in range(len(a)):
i += 20
return count
</syntaxhighlight>
</source>
Сортируем список для того, чтобы не выполнять во второй группе циклов лишние итерации.
<!--==Диапазоны==
<ol>
<li>Пусть, есть диапазон размером s и начинающийся с a. Если мы стоим на элементе a, то попасть на последний элемент диапазона мы можем так:
<sourcesyntaxhighlight lang="python">a[i + s - 1]</sourcesyntaxhighlight></li>
<li>Пусть, есть диапазоны, располагающиеся на одинаковом расстоянии. Переменная d - количество элементов между диапазонами. Переход от первого элемента n-ого диапазона к первому элементу n + 1-ого диапазона будет выглядеть так:
<sourcesyntaxhighlight lang="python">a[i + s + d]</sourcesyntaxhighlight></li>
<li>Пусть, есть диапазоны, располагающиеся на одинаковом расстоянии. Переменная d - количество элементов между диапазонами. m - смещение первого элемента первого диапазона относительно 0. Переход от первого элемента n-ого диапазона к первому элементу n + 1-ого диапазона будет выглядеть так:
<sourcesyntaxhighlight lang="python">a[i + s + d + m]</sourcesyntaxhighlight></li>
<li>Пусть, есть диапазоны, располагающиеся на одинаковом расстоянии. Переменная d - количество элементов между диапазонами. m - смещение первого элемента первого диапазона относительно 0. Переход от первого элемента n-ого диапазона к первому элементу n + k-ого диапазона будет выглядеть так:
<sourcesyntaxhighlight lang="python">a[i + (s + d)*k + m]</sourcesyntaxhighlight></li>
</ol>
-->
==Удаление элементов==
Пусть, есть список a, из которого надо удалить n элементов, начиная с i-ого элемента. Код удаления элементов будет следующий:
<sourcesyntaxhighlight lang="python">
def Delete(a, i, n):
b = []
return ''.join(b)[:len(b) - n:]
</syntaxhighlight>
</source>
 
==Сортировка по алфавиту==
# Создать список, определяющий номер каждой первой буквы каждой строки в алфавите.
# Отсортировать два списка.
<sourcesyntaxhighlight lang="python">
def SortList(a):
alph = 'abcdefgijklmnopqrstuvwxyz'
a[i], a[j] = a[j], a[i]
return a
</syntaxhighlight>
</source>
Вариант с кэшированием уже найденных символов:
<sourcesyntaxhighlight lang="python">
def SortList(a):
alph = 'abcdefgijklmnopqrstuvwxyz'
a[i], a[j] = a[j], a[i]
return a
</syntaxhighlight>
</source>
===Сортировка словаря===
Сам словарь отсортировать невозможно напрямую.
<sourcesyntaxhighlight lang="python">
def SortList(d):
a = d.keys()
a[i], a[j] = a[j], a[i]
return a
</syntaxhighlight>
</source>
===Поиск подстроки===
<sourcesyntaxhighlight lang="python">
def Find(Str, substr):
k = 0 # Количество равных символов.
else:
return -1
</syntaxhighlight>
</source>
====Поиск подстроки по шаблону====
Для каждого символа строки Str мы задаем список допустимых для него значений.
<sourcesyntaxhighlight lang="python">
def Find(Str, patternL):
k = 0 # Количество равных символов.
else:
return -1
</syntaxhighlight>
</source>
Пример использования:
<sourcesyntaxhighlight lang="python">
Find('a1b324a2b124',[['a', 'b'], ['1']])
</syntaxhighlight>
</source>
 
===Удаление подстроки===
# В условии «(len(Str) > len(substr)) and (len(substr) != 0)» не пишем «and (len(Str) != 0)», так как часть условия «len(Str) > len(substr)» исключает это условие.
# i меняется от 0 до суммы разности длин строк и единицы, так как последнее значение в функции «range(0, len(Str) - len(substr) + 1)» не включается.
<sourcesyntaxhighlight lang="python">
def DeleteSubstr(Str, substr):
k = 0 # Количество равных символов.
else:
return -1
</syntaxhighlight>
</source>
<sourcesyntaxhighlight lang="python">
def DeleteSubstrs(Str, substr):
k = 0 # Количество равных символов.
else:
return -1
</syntaxhighlight>
</source>
<sourcesyntaxhighlight lang="python">
def DeleteSubstrs(Str, substr):
s = Str
s = DeleteSubstr(s, substr)
return s
</syntaxhighlight>
</source>
==Поиск корня==
Нахождение квадратного корня:
<sourcesyntaxhighlight lang="python">
import math
def Sqrt(x):
a = a*1.5
return a
</syntaxhighlight>
</source>
Нахождение корня n-ной степени:
<sourcesyntaxhighlight lang="python">
import math
def Sqrt(x, n):
a = a*1.5
return a
</syntaxhighlight>
</source>
 
=Четность и нечетность элемента в списке=
583

правки