Кстати ниже или не ниже, она не определяет (честно скажу лень мучиться), программа просто ставит точки на двух картинках.
Вместе с кодом для понятности придется еще и картинки сюда закинуть.
from PIL import Image, ImageDraw
import sys
# Входные параметры:
# Nem - эффективная частота вращения
# Me - эффективный крутящий момент
# Nemax - максимальная частота вращения
# Memax - максимальный крутящий момент
# nN - номинальная частота вращения
# engine - маркировка двигателя
def draw_points(Nem,Me,Nemax,Memax,nN,engine):
tmp = float(nN)
nN = tmp
CFM71 = ["CFM71S","CFM71M","CFM71L"]
CFM90 = ["CFM90S","CFM90M","CFM90L"]
CFM112 = ["CFM112S","CFM112M","CFM112L"]
CFM112H = ["CFM112H"]
DFS56 = ["DFS56S","DFS56M","DFS56L"]
if engine==CFM71:
im_max = "CM71_max"
xymax = [754,148]
im_nom = "CM71_nom"
xynom = [751,151]
inNMax = [0,nN]
inMMax = [0,35.0]
inNNom = [0,6000.0]
inMNom = [0,16.0]
elif engine==CFM90:
im_max = "CM90_max"
xymax = [764,148]
im_nom = "CM90_nom"
xynom = [750,144]
inNMax = [0,nN]
inMMax = [0,80.0]
inNNom = [0,6000.0]
inMNom = [0,35.0]
elif engine==CFM112:
im_max = "CM112_max"
xymax = [754,123]
im_nom = "CM112SL_nom"
xynom = [733,76]
inNMax = [0,nN]
inMMax = [0,250.0]
inNNom = [0,4500.0]
inMNom = [0,70.0]
elif engine==CFM112H:
im_max = "CM112_max"
xymax = [754,123]
im_nom = "CM112H_nom"
xynom = [688,157]
inNMax = [0,nN]
inMMax = [0,250.0]
inNNom = [0,4500.0]
inMNom = [0,160.0]
else: # engine==DFS56
im_max = "DS56_max"
xymax = [741,155]
im_nom = "DS56_nom"
xynom = [733,160]
inNMax = [0,nN]
inMMax = [0,16.0]
inNNom = [0,6000.0]
inMNom = [0,4.5]
# Открываем картинки
image_Max = Image.open(im_max+".ppm")
image_Nom = Image.open(im_nom+".ppm")
# Определим цену деления
priceMMax=(inMMax[1]-inMMax[0])/(500-xymax[1])
priceNMax=(inNMax[1]-inNMax[0])/(xymax[0]-100)
print("priceMMax = "+str(priceMMax))
print("priceNMax = "+str(priceNMax))
priceMNom=(inMNom[1]-inMNom[0])/(500-xynom[1])
priceNNom=(inNNom[1]-inNNom[0])/(xynom[0]-100)
print("priceMNom = "+str(priceMNom))
print("priceNMax = "+str(priceNMax))
# Определим координаты точек
ymax=(-Memax)/priceMMax+500
xmax=Nemax/priceNMax+100
ymax = int(round(ymax))
xmax = int(round(xmax))
ynom=(-Me)/priceMNom+500
xnom=Nem/priceNNom+100
ynom = int(round(ynom))
xnom = int(round(xnom))
# Рисуем точки
# Жирность точки
B = 5
# Цвет точки
color=0
drawmax = ImageDraw.Draw(image_Max)
drawnom = ImageDraw.Draw(image_Nom)
for x in range(xmax-B,xmax+B):
for y in range(ymax-B,ymax+B):
drawmax.point((x,y),fill=color)
for x in range(xnom-B,xnom+B):
for y in range(ynom-B,ynom+B):
drawnom.point((x,y),fill=color)
del drawmax
del drawnom
image_Max.save("engine_1_max.eps")
image_Nom.save("engine_1_nom.eps")
print("Изображения сохранены!")
К сожалению, как выяснилось зона графика не везде одинаковая, поэтому верхняя правая точка графика, указана в скрипте (это там где куча условий). Также для определения цены деления, записаны диапазоны (на каждой картинке свой диапазон моментов и частот, тоже в кипе условий). Сильно не пинать, если код корявый, я только учусь (на автоматизации процессов решения курсовых)

.
Ну а результат работы модуля в купе с основным скриптом (или как это правильно назвать), представлен на PDF.
Возможно позже добавлю функцию, которая определяет ниже точка линии или нет, хотя честно скажу сомневаюсь, что я этим займусь (стимула нету, курсовые сдам и усё).