LINUX.ORG.RU
ФорумTalks

35 лет назад Гвидо ван Россум написал в сети Usenet: «This is Python»...

 


0

2

Python 0.9.1 part 01/21:

Guido van Rossum guido at cwi.nl
Wed Feb 20 04:35:26 AEST 1991
Previous message (by thread): unbatcher out of sync?
Next message (by thread): Python 0.9.1 part 03/21
Messages sorted by: [ date ] [ thread ] [ subject ] [ author ]

: This is a shell archive.
: Extract with 'sh this_file'.
: Extract this part first since it makes all directories
echo 'Start of pack.out, part 01 out of 21:'
echo -n 'Making directories ... '
err="no"
test -d 'demo' || mkdir 'demo' || err="yes"
test -d 'demo/scripts' || mkdir 'demo/scripts' || err="yes"
test -d 'demo/sgi' || mkdir 'demo/sgi' || err="yes"
test -d 'demo/sgi/audio' || mkdir 'demo/sgi/audio' || err="yes"
test -d 'demo/sgi/audio_stdwin' || mkdir 'demo/sgi/audio_stdwin' || err="yes"
test -d 'demo/sgi/gl' || mkdir 'demo/sgi/gl' || err="yes"
test -d 'demo/sgi/gl_panel' || mkdir 'demo/sgi/gl_panel' || err="yes"
test -d 'demo/sgi/gl_panel/apanel' || mkdir 'demo/sgi/gl_panel/apanel' || err="yes"
test -d 'demo/sgi/gl_panel/flying' || mkdir 'demo/sgi/gl_panel/flying' || err="yes"
test -d 'demo/sgi/gl_panel/nurbs' || mkdir 'demo/sgi/gl_panel/nurbs' || err="yes"
test -d 'demo/sgi/gl_panel/twoview' || mkdir 'demo/sgi/gl_panel/twoview' || err="yes"
test -d 'demo/stdwin' || mkdir 'demo/stdwin' || err="yes"
test -d 'doc' || mkdir 'doc' || err="yes"
test -d 'lib' || mkdir 'lib' || err="yes"
test -d 'src' || mkdir 'src' || err="yes"
echo 'done'
if test "$err" = "yes"
then echo "didn't make it."
fi
if test -s 'README'
then echo '*** I will not over-write existing file README'
else
echo 'x - README'
sed 's/^X//' > 'README' << 'EOF'
This is Python, an extensible interpreted programming language that
combines remarkable power with very clear syntax.

This is version 0.9 (the first beta release), patchlevel 1.

Python can be used instead of shell, Awk or Perl scripts, to write
prototypes of real applications, or as an extension language of large
systems, you name it.  There are built-in modules that interface to
the operating system and to various window systems: X11, the Mac
window system (you need STDWIN for these two), and Silicon Graphics'
GL library.  It runs on most modern versions of UNIX, on the Mac, and
I wouldn't be surprised if it ran on MS-DOS unchanged.  I developed it
mostly on an SGI IRIS workstation (using IRIX 3.1 and 3.2) and on the
Mac, but have tested it also on SunOS (4.1) and BSD 4.3 (tahoe).

Building and installing Python is easy (but do read the Makefile).
A UNIX style manual page and extensive documentation (in LaTeX format)
are provided.  (In the beta release, the documentation is still under
development.)

Please try it out and send me your comments (on anything -- the
language design, implementation, portability, installation,
documentation) and the modules you wrote for it, to make the first
real release better.  If you needed to hack the source to get it to
compile and run on a particular machine, send me the fixes -- I'll try
to incorporate them into the next patch.  If you can't get it to work
at all, send me a *detailed* description of the problem and I may look
into it.

If you want to profit of the X11 or Mac window interface, you'll need
STDWIN.  This is a portable window system interface by the same
author.  The versions of STDWIN floating around on some archives are
not sufficiently up-to-date for use with Python.  I will distribute
the latest and greatest STDWIN version at about the same time as Python.

I am the author of Python:

	Guido van Rossum
	CWI, dept. CST
	Kruislaan 413
	1098 SJ  Amsterdam
	The Netherlands

	E-mail: guido at cwi.nl

The Python source is copyrighted, but you can freely use and copy it
as long as you don't change or remove the copyright:

/***********************************************************
Copyright 1991 by Stichting Mathematisch Centrum, Amsterdam, The
Netherlands.
# Fancy NURBS demo.  Require Z buffer and Panel Library.

from gl import *
from GL import *
from DEVICE import *
from nurbsdata import *
import panel

#
# flags = trim_f, invis_f, cpvis_f, tpvis_f, axvis_f, freeze_f
#
TRIM	= 0
VIS	= 1
CPVIS	= 2
TPVIS	= 3
AXVIS	= 4
FREEZE	= 5
flags = [0, 1, 0, 0, 0, 0]

def draw_axis () :
	cpack (0x0)
	zero = (0.0, 0.0, 0.0)
	#
	one = (1.0, 0.0, 0.0)
	smallline (zero, one)
	cmov (1.0, 0.0, 0.0)
	charstr ('x')
	#
	one = (0.0, 1.0, 0.0)
	smallline (zero, one)
	cmov (0.0, 1.0, 0.0)
	charstr ('y')
	#
	one = (0.0, 0.0, 1.0)
	smallline (zero, one)
	cmov (0.0, 0.0, 1.0)
	charstr ('z')

DELTA = 0.1

def cross (p) :
	p0 = [p[0], p[1], p[2]]
	p1 = [p[0], p[1], p[2]]
	for i in range (0, 3) :
		p0[i] = p0[i] + DELTA
		p1[i] = p1[i] - DELTA
		smallline (p0, p1)
		p0[i] = p0[i] - DELTA
		p1[i] = p1[i] + DELTA

def smallline (p0, p1) :
	bgnline ()
	v3f (p0)
	v3f (p1)
	endline ()

def draw_pts (pnts, color) :
	linewidth (2)
	cpack (color)
	for i in pnts :
		cross (i)

def init_windows():
	foreground()
	wid = winopen('nurbs')
	wintitle('NURBS Surface')
	doublebuffer()
	RGBmode()
	gconfig()
	lsetdepth(0x000, 0x7fffff)
	zbuffer( TRUE )

def init_view():
	mmode(MPROJECTION)
	ortho( -5., 5., -5., 5., -5., 5. )
	#
	mmode(MVIEWING)
	loadmatrix(idmat)
	#
	lmbind(MATERIAL, 1)

def set_scene(flags):
	#
	lmbind(MATERIAL, 0)
	RGBcolor(150,150,150)
	lmbind(MATERIAL, 1)
	clear()
	zclear()
	#
	if not flags[FREEZE] :
		rotate( 100, 'y' )
		rotate( 100, 'z' )

def draw_trim_surface(flags):
	pnts = ctlpoints
	if flags[VIS] :
		bgnsurface()
		nurbssurface(surfknots,surfknots,pnts,ORDER,ORDER,N_XYZ)
		if flags[TRIM]:
			bgntrim()
			nurbscurve(trimknots,trimpoints,ORDER-1,N_STW)
			endtrim()
		endsurface()
	#
	if flags[CPVIS] :
		for i in pnts :
			draw_pts (i, RED)
	#
	if flags[TPVIS] :
		tpts = trimpoints
		draw_pts (tpts, YELLOW)
	#
	if flags[AXVIS] :
		draw_axis ()
	#
	swapbuffers()

def make_lights():
	lmdef(DEFLMODEL,1,[])
	lmdef(DEFLIGHT,1,[])
	#
	# define material #1
	#
	a = []
	a = a + [EMISSION, 0.0, 0.0, 0.0]
	a = a + [AMBIENT,  0.1, 0.1, 0.1]
	a = a + [DIFFUSE,  0.6, 0.3, 0.3]
	a = a + [SPECULAR,  0.0, 0.6, 0.0]
	a = a + [SHININESS, 2.0]
	a = a + [LMNULL]
	lmdef(DEFMATERIAL, 1, a)
	#
	# turn on lighting
	#
	lmbind(LIGHT0, 1)
	lmbind(LMODEL, 1)

def main():
	init_windows()
	make_lights()
	init_view()
	#
	panel.needredraw()
	panels = panel.defpanellist('nurbs.s')
	p = panels[0]
	#
	def cbtrim (a) :
		flags[TRIM:TRIM+1] = [int (a.val)]
	p.trim.upfunc = cbtrim
	#
	def cbquit (a) :
		import sys
		sys.exit (1)
	p.quit.upfunc = cbquit
	#
	def cbmotion (a) :
		flags[FREEZE:FREEZE+1] = [int (a.val)]
	p.motion.upfunc = cbmotion
	#
	def cbxyzaxis (a) :
		flags[AXVIS:AXVIS+1] = [int (a.val)]
	p.xyzaxis.upfunc = cbxyzaxis
	#
	def cbtrimpnts (a) :
		flags[TPVIS:TPVIS+1] = [int (a.val)]
	p.trimpnts.upfunc = cbtrimpnts
	#
	def cbcntlpnts (a) :
		flags[CPVIS:CPVIS+1] = [int (a.val)]
	p.cntlpnts.upfunc = cbcntlpnts
	#
	def cbnurb (a) :
		flags[VIS:VIS+1] = [int (a.val)]
	p.nurb.upfunc = cbnurb
	#
	set_scene(flags)
	setnurbsproperty( N_ERRORCHECKING, 1.0 )
	setnurbsproperty( N_PIXEL_TOLERANCE, 50.0 )
	draw_trim_surface(flags)
	#
	while 1:
		act = panel.dopanel()
		#
		wid =  panel.userredraw ()
		if wid :
			winset (wid)
			reshapeviewport()
			set_scene(flags)
			draw_trim_surface(flags)
		#
		set_scene(flags)
		draw_trim_surface(flags)

main()
★★★★★

Дай бог ему здоровья, жену красавицу и много много потомков.

One ★★★★★
()

35 лет назад Гвидо ван Россум написал в сети Usenet: «This is Python»…

Дикпиков тогда не было, пришлось писать язык программирования.

Многие решения в языке очень спорные.

MoldAndLimeHoney ★★
()
Ответ на: комментарий от FishHook

Я по сути примерно про этот вопрос хотел изначально написать статью, пока меня резко не унесло в геополитику:
https://bykozy.me/blog/attention-economics-and-software-engineering/

Суть в том, что, да, возникновение хорошего инструмента спонтанно силами сообщества практически невозможно. И в энтерпрайзных комитетах оно тоже невозможно, потому что там сидят плюс-минус похожие люди.

Самый яркий пример из недавних — язык V (https://github.com/vlang/v), у которого даже нет норм работоспособного компилятора, но зато 37к звёзд на гитхабе, потому что автор оптимизирует заявляемые фичи по ключевым словам на Hacker News.

Также я могу привести пример ЯП с минимальным кол-вом спорных решений — это Go. Но его очевидно не сообщество делало.

byko3y ★★★★
()

Как так получилось, что питон выстрелил гораздо громче, чем рубин? Ведь никакая корпа за питоном не стояла.

seiken ★★★★★
()
Ответ на: комментарий от antonio-an

а я тогда в Doom играл из Dos

А я в Digger!

Пам-пам-пам-пам-пам, па, па-пам
Пам-пам-пам-пам-пам, па, па-пам
dataman ★★★★★
() автор топика
Ответ на: комментарий от byko3y

Похож на раст с причесанным синтаксисом.

dicos ★★★
()
Ответ на: комментарий от antonio-an

Ну вот ты серьёзно сейчас?

Потому что Wolfenstein 3D вышел в 1992. А в феврале 1991 еща даже и Catacomb 3D не было, он только в конце года вышел.

CrX ★★★★★
()

И где теперь тот Гвидо? Заложил идеологическую диверсию под ИТ отраслью и был таков

cobold ★★★★★
()
Ответ на: комментарий от CrX

Ну вот ты серьёзно сейчас?

Потому что Wolfenstein 3D вышел в 1992. А в феврале 1991 еща даже и Catacomb 3D не было, он только в конце года вышел.

Я что помнить должен когда они вышли.

Но играл точно!!

antonio-an
()

это ж надо так всем поднасрать

Psilocybe ★★★★★
()
Ответ на: комментарий от byko3y

Позвольте,

Golang реально хорош для корпорации Гоголь , то что ща штангисты получают больше чернорабочих это переходный процесс ибо при всей красоте творения Пайка Томпсона Грисмаера? Тула то заточена под конкурентное байтолюбие лицами которые и до квадратных уравнений с их мистическими дискрименантами в своей банголорской жизни ни сталкивались а жесть с fmt уже тогда ожидала что по мере прогресса кожаные мешки не обязательный компонент синтеза кодов

ПитонаМонти при всех его врождённых атавизмах и рудиментах в отличии от lua боженька поцеловал в 94-97 годах сначала ДюБуа а в дальнейшем Numeric numpy нашего Олифантища ,Бизли свидетель

qulinxao3 ★☆
()
Последнее исправление: qulinxao3 (всего исправлений: 1)
Ответ на: комментарий от seiken

Ну как это никакая, гугл взял Гвидо на поруки и, в некоторым смысле, продвигал Пистон.

MoldAndLimeHoney ★★
()
Ответ на: комментарий от antonio-an

Я что помнить должен когда они вышли.

Конечно ты никому ничего не должен. Но можно просто не писать нелепую чушь про то, как играл в Doom в феврале 1991.

Но играл точно!!

Сложно найти человека, который не играл в Doom :)

CrX ★★★★★
()
Ответ на: комментарий от dataman

Шитый код - как раз спорное решение. Тогда он был хорош, но с появлением конвейера стал скорее проблемой.

GAMer ★★★★★
()

Ван Россум просто дал перфокартам иную жизнь: «позиции имеют значение», «пробелы важны» ;-)

MKuznetsov ★★★★★
()
Ответ на: комментарий от dataman

Ну нет жи еси

Т.е идея отдельного(от остального содержимого)стека возвратов это огонь

Но вот конкретный форт которого ещё и убили ansi стандартизация аж двумя 78 и 84 годов дух форт очевидно всё ещё тут.

qulinxao3 ★☆
()
Последнее исправление: qulinxao3 (всего исправлений: 1)
Ответ на: комментарий от GAMer

основная крутость что благодаря «однокомандному инетретатору» происходит переход из одного слова в следующее без оказывания в обьемлющем слове - да там куча косвенного чтения инкремента но сама красота однокомандного стандартного косвенного перехода это реально один из пёрлов образования в вычислительной науке

qulinxao3 ★☆
()
Ответ на: комментарий от antonio-an

Ах вот кто с ЛОРа машину времени стащил…

hobbit ★★★★★
()
Ответ на: комментарий от MKuznetsov

А я всегда говорил, что мало было людям одного Фортрана – Питон притащили.

hobbit ★★★★★
()
Ответ на: комментарий от seiken

Как так получилось, что питон выстрелил гораздо громче, чем рубин? Ведь никакая корпа за питоном не стояла.

Уже ответили, могу немножко дополнить картинку. Прежде всего, питон возник немного раньше. Этого было достаточно для того, чтобы в академической среде возникла инерция в пользу питона. Ну то есть у академической среды очень специфичная необучаемость: они могут за полгода освоить один инструмент, и потом лет 10 безуспешно пытаться осваивать другой.

Да, потом пришел гугл, но пришел он на ненулевую инфраструктуру, которую просто взял с полки и задействовал. Даже нанял Гнидо и ко для оптимизации питона — ничего у них не получилось. По итогу гугл сделал Go, как вполне себе целенправленную замену питону — заметь, даже утиная типизация интерфейсов из питона взята.

Также, для баланса, нужно заметить, что Ruby on Rails был поддержан Apple, отсюда его локальная популярность. Но в академическую среду и маш обуч руби так и не заехал.

byko3y ★★★★
()
Ответ на: комментарий от qulinxao3

Я не понял, это претензия или дополнения к моей фразе? Гугл разработал Go для замены питону и, да, больше для своих внутренних целей, для того, чтобы садить низкоквалифицированных кодеров писать серверную логику.

byko3y ★★★★
()

Usenet

какую сеть просрали, наверное и поддержку nntp скоро выкинут отовсюду, собственно в аутлуке её давно уже нет

sergej ★★★★★
()

А кто-нибудь пробовал это демо запустить на совремённом Python?

Между прочим, в тему полезности ИИ, Stanson - это вот действительно никак не полезно?

У меня не получилось запустить или как-то очевидно исправить этот старый код, поручил бесплатному Qwen 3.5 Plus переписать под Python 3.11, получилось что-то вроде даже работающее. В OpenGL я не то, чтобы сильно разбираюсь. Исходный промпт был:

Есть старый исторический код на Python 0.9, перепиши его на современном Python 3.11, чтобы он работал.

Далее код из стартпоста.

В ответ написал, что

Этот код написан для IRIS GL (предшественник OpenGL) на библиотеках Silicon Graphics (SGI), которые использовались в начале 90-х годов. Эти библиотеки (gl, GL, DEVICE, panel) безвозвратно утеряны и не существуют для современного Python.
Чтобы запустить эту логику на Python 3.11, необходимо:

    Заменить IRIS GL на PyOpenGL.
    Заменить оконный менеджер и ввод (SGI panel/DEVICE) на pygame (для создания окна и обработки событий).
    Заменить устаревшие вызовы NURBS на OpenGL.GLU (так как современный OpenGL Core Profile не поддерживает NURBS напрямую, мы используем совместимый режим через GLU).
    Встроить данные NURBS прямо в код, так как файл nurbsdata отсутствует.

Ниже представлен полностью переписанный, рабочий код.  Надо сказать, что понадобилось полчаса времени и 9 итераций и я честно говоря, не уверен, что на выходе именно то, что имел ввиду Гвидо в 1991-м.  Во всяком случае пояснений на русском языке к интерфейсу с нажатиями клавиш точно не было :))))

Для работы надо установить (лучше всего в отдельном venv)

pip install pygame PyOpenGL PyOpenGL_accelerate

anonymous_incognito ★★★★★
()
Ответ на: комментарий от anonymous_incognito

Сам код:

import sys
import pygame
from pygame.locals import *
from OpenGL.GL import *
from OpenGL.GLU import *
import numpy as np

# ==============================================================================
# ДАННЫЕ ПОВЕРХНОСТИ (Контрольные точки)
# ==============================================================================

ctlpoints = np.array([
    [[-1.5, -1.5, 0.0], [-0.5, -1.5, 0.2], [0.5, -1.5, 0.2], [1.5, -1.5, 0.0]],
    [[-1.5, -0.5, 0.2], [-0.5, -0.5, 0.5], [0.5, -0.5, 0.5], [1.5, -0.5, 0.2]],
    [[-1.5,  0.5, 0.2], [-0.5,  0.5, 0.5], [0.5,  0.5, 0.5], [1.5,  0.5, 0.2]],
    [[-1.5,  1.5, 0.0], [-0.5,  1.5, 0.2], [0.5,  1.5, 0.2], [1.5,  1.5, 0.0]],
], dtype=np.float32)

trimpoints = np.array([
    [-0.5, -0.5, 1.0],
    [ 0.5, -0.5, 1.0],
    [ 0.5,  0.5, 1.0],
    [-0.5,  0.5, 1.0],
    [-0.5, -0.5, 1.0],
], dtype=np.float32)

# ==============================================================================
# КОНСТАНТЫ И ФЛАГИ
# ==============================================================================
TRIM    = 0
VIS     = 1
CPVIS   = 2
TPVIS   = 3
AXVIS   = 4
FREEZE  = 5

RED     = (1.0, 0.0, 0.0)
YELLOW  = (1.0, 1.0, 0.0)
BLUE    = (0.5, 0.5, 0.8)

flags = [0, 1, 0, 0, 0, 0]
DELTA = 0.1

# ==============================================================================
# ГРАФИЧЕСКИЕ ФУНКЦИИ
# ==============================================================================

def compute_normal(p0, p1, p2):
    v1 = np.array(p1) - np.array(p0)
    v2 = np.array(p2) - np.array(p0)
    n = np.cross(v1, v2)
    norm = np.linalg.norm(n)
    if norm > 0:
        n = n / norm
    return n

def draw_surface_mesh(ctlpoints, resolution=20):
    u_steps = resolution
    v_steps = resolution
    
    glBegin(GL_QUADS)
    for i in range(u_steps):
        for j in range(v_steps):
            p00 = ctlpoints[i % 3, j % 3]
            p01 = ctlpoints[i % 3, (j + 1) % 4]
            p10 = ctlpoints[(i + 1) % 4, j % 3]
            p11 = ctlpoints[(i + 1) % 4, (j + 1) % 4]
            
            n00 = compute_normal(p00, p01, p10)
            n01 = compute_normal(p01, p11, p00)
            n10 = compute_normal(p10, p00, p11)
            n11 = compute_normal(p11, p10, p01)
            
            u = i / u_steps
            v = j / v_steps
            u_next = (i + 1) / u_steps
            v_next = (j + 1) / v_steps
            
            pt00 = (1 - u) * ((1 - v) * p00 + v * p01) + u * ((1 - v) * p10 + v * p11)
            pt01 = (1 - u) * ((1 - v_next) * p00 + v_next * p01) + u * ((1 - v_next) * p10 + v_next * p11)
            pt11 = (1 - u_next) * ((1 - v_next) * p00 + v_next * p01) + u_next * ((1 - v_next) * p10 + v_next * p11)
            pt10 = (1 - u_next) * ((1 - v) * p00 + v * p01) + u_next * ((1 - v) * p10 + v * p11)
            
            glNormal3f(float(n00[0]), float(n00[1]), float(n00[2]))
            glVertex3f(float(pt00[0]), float(pt00[1]), float(pt00[2]))
            glNormal3f(float(n01[0]), float(n01[1]), float(n01[2]))
            glVertex3f(float(pt01[0]), float(pt01[1]), float(pt01[2]))
            glNormal3f(float(n11[0]), float(n11[1]), float(n11[2]))
            glVertex3f(float(pt11[0]), float(pt11[1]), float(pt11[2]))
            glNormal3f(float(n10[0]), float(n10[1]), float(n10[2]))
            glVertex3f(float(pt10[0]), float(pt10[1]), float(pt10[2]))
    glEnd()

def draw_axis():
    """Рисует оси координат (RGB = XYZ)"""
    glDisable(GL_LIGHTING)
    glLineWidth(2.0)
    
    # X ось - красный
    glColor3f(1.0, 0.0, 0.0)
    glBegin(GL_LINES)
    glVertex3f(0.0, 0.0, 0.0)
    glVertex3f(2.0, 0.0, 0.0)
    glEnd()
    
    # Y ось - зелёный
    glColor3f(0.0, 1.0, 0.0)
    glBegin(GL_LINES)
    glVertex3f(0.0, 0.0, 0.0)
    glVertex3f(0.0, 2.0, 0.0)
    glEnd()
    
    # Z ось - синий
    glColor3f(0.0, 0.0, 1.0)
    glBegin(GL_LINES)
    glVertex3f(0.0, 0.0, 0.0)
    glVertex3f(0.0, 0.0, 2.0)
    glEnd()
    
    glEnable(GL_LIGHTING)

def cross(p):
    px, py, pz = float(p[0]), float(p[1]), float(p[2])
    glBegin(GL_LINES)
    for i in range(3):
        p0 = [px, py, pz]
        p1 = [px, py, pz]
        p0[i] += DELTA
        p1[i] -= DELTA
        glVertex3f(float(p0[0]), float(p0[1]), float(p0[2]))
        glVertex3f(float(p1[0]), float(p1[1]), float(p1[2]))
    glEnd()

def draw_ctl_points(pts, color):
    glLineWidth(2.0)
    glColor3f(*color)
    for i in range(pts.shape[0]):
        for j in range(pts.shape[1]):
            cross(pts[i, j])

def draw_trim_points(pts, color):
    glLineWidth(2.0)
    glColor3f(*color)
    for k in range(len(pts)):
        pt = pts[k]
        cross((float(pt[0])*2, float(pt[1])*2, 0.0))

def init_windows():
    pygame.init()
    display = (800, 600)
    pygame.display.set_mode(display, DOUBLEBUF | OPENGL)
    pygame.display.set_caption('NURBS Surface (Fixed Freeze)')
    glEnable(GL_DEPTH_TEST)
    glDepthFunc(GL_LESS)

def init_view():
    glMatrixMode(GL_PROJECTION)
    glLoadIdentity()
    gluPerspective(45, (800 / 600), 0.1, 50.0)
    
    glMatrixMode(GL_MODELVIEW)
    glLoadIdentity()
    glTranslatef(0.0, 0.0, -10.0)
    
    glEnable(GL_LIGHTING)
    glEnable(GL_LIGHT0)
    glEnable(GL_COLOR_MATERIAL)
    glEnable(GL_NORMALIZE)
    
    light_position = [5.0, 5.0, 5.0, 1.0]
    glLightfv(GL_LIGHT0, GL_POSITION, light_position)
    
    glMaterialfv(GL_FRONT, GL_AMBIENT, [0.1, 0.1, 0.1, 1.0])
    glMaterialfv(GL_FRONT, GL_DIFFUSE, [0.6, 0.3, 0.3, 1.0])
    glMaterialfv(GL_FRONT, GL_SPECULAR, [1.0, 1.0, 1.0, 1.0])
    glMaterialfv(GL_FRONT, GL_SHININESS, [50.0])

def draw_trim_surface(flags, angle):
    # 1. Поверхность
    if flags[VIS]:
        glColor3f(*BLUE)
        draw_surface_mesh(ctlpoints, resolution=20)
        
        # 2. Обрезка
        if flags[TRIM]:
            glColor3f(1.0, 0.0, 0.0)
            glDisable(GL_LIGHTING)
            glLineWidth(3.0)
            glBegin(GL_LINE_LOOP)
            for k in range(len(trimpoints)):
                pt = trimpoints[k]
                glVertex3f(float(pt[0]), float(pt[1]), 0.3)
            glEnd()
            glEnable(GL_LIGHTING)

    # 3. Контрольные точки
    if flags[CPVIS]:
        draw_ctl_points(ctlpoints, RED)

    # 4. Точки обрезки
    if flags[TPVIS]:
        draw_trim_points(trimpoints, YELLOW)

    # 5. Оси
    if flags[AXVIS]:
        draw_axis()

def print_help():
    print("\n--- Управление (NURBS Demo) ---")
    print("V : Видимость поверхности (VIS)")
    print("T : Обрезка (TRIM)")
    print("C : Контрольные точки (CPVIS)")
    print("P : Точки обрезки (TPVIS)")
    print("A : Оси координат (AXVIS)")
    print("F : Заморозить вращение (FREEZE)")
    print("Q : Выход")
    print("-------------------------------")

anonymous_incognito ★★★★★
()
Ответ на: комментарий от anonymous_incognito

Предыдущий текст не влез в сообщение, отдельно def main скопировал


def main():
    global flags
    
    init_windows()
    init_view()
    print_help()
    
    clock = pygame.time.Clock()
    running = True
    angle = 0 
    frozen_angle = 0  # Сохраняемый угол при заморозке

    while running:
        for event in pygame.event.get():
            if event.type == pygame.QUIT:
                running = False
            elif event.type == pygame.KEYDOWN:
                if event.key == pygame.K_q:
                    running = False
                elif event.key == pygame.K_v:
                    flags[VIS] = 1 - flags[VIS]
                    print(f"VIS: {bool(flags[VIS])}")
                elif event.key == pygame.K_t:
                    flags[TRIM] = 1 - flags[TRIM]
                    print(f"TRIM: {bool(flags[TRIM])}")
                elif event.key == pygame.K_c:
                    flags[CPVIS] = 1 - flags[CPVIS]
                    print(f"CPVIS: {bool(flags[CPVIS])}")
                elif event.key == pygame.K_p:
                    flags[TPVIS] = 1 - flags[TPVIS]
                    print(f"TPVIS: {bool(flags[TPVIS])}")
                elif event.key == pygame.K_a:
                    flags[AXVIS] = 1 - flags[AXVIS]
                    print(f"AXVIS: {bool(flags[AXVIS])}")
                elif event.key == pygame.K_f:
                    flags[FREEZE] = 1 - flags[FREEZE]
                    print(f"FREEZE: {bool(flags[FREEZE])}")
                    # ИСПРАВЛЕНИЕ: сохраняем текущий угол при заморозке
                    if flags[FREEZE]:
                        frozen_angle = angle

        glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT)
        glLoadIdentity()
        glTranslatef(0.0, 0.0, -10.0)
        
        # ИСПРАВЛЕНИЕ: используем сохранённый угол при FREEZE
        if not flags[FREEZE]:
            angle += 0.5
            current_angle = angle
        else:
            current_angle = frozen_angle
        
        glRotatef(current_angle, 0, 1, 0)
        glRotatef(20, 1, 0, 0)

        draw_trim_surface(flags, current_angle)
        
        pygame.display.flip()
        clock.tick(60)

    pygame.quit()
    sys.exit()

if __name__ == '__main__':
    try:
        main()
    except Exception as e:
        print(f"Ошибка: {e}")
        import traceback
        traceback.print_exc()
        sys.exit(1)
anonymous_incognito ★★★★★
()
Последнее исправление: anonymous_incognito (всего исправлений: 1)
Ответ на: комментарий от anonymous_incognito

Между прочим, в тему полезности ИИ,

Жёваный крот. Не существует никакого ИИ. Вообще никакого. Есть только трейдмарк ИИ™, который как водится, мухлёж в чистом виде. В связи с полным отсутствием ИИ, никакой темы полезности ИИ быть не может. Если кому-то хочется употреблять этот трейдмарк в отношении нейросеточек - то пишите либо в кавычках - «ИИ», либо ИИ™.

Stanson - это вот действительно никак не полезно?

Надо сказать, что понадобилось полчаса времени и 9 итераций и я честно говоря, не уверен, что на выходе именно то, что имел ввиду Гвидо в 1991-м.

И что же тут может быть полезного? Тупая нейросеть принципиально не может понять что делает код, поэтому никакой увернности в результате не может быть никогда. Нейросеть всегда надо будет проверять вручную, что часто намного затратнее чем сделать то же самое самому.

Stanson ★★★★★
()
Последнее исправление: Stanson (всего исправлений: 2)
Ответ на: комментарий от anonymous_incognito

Предыдущий текст не влез в сообщение

а оригинальный оригинал влез

тут или ИИ туп или Питон скатился в УГ :-) впрочем скорее оба варианта

кстати, хорошая демонстрация что лучшее это враг хорошего. И при развитии ЯП (не только языков, а вообще) экспонентно возрастает сложность и снижаются возможности.

Любая фича много чего из прежнего убивает, чего в дальнейшем уже не будет

MKuznetsov ★★★★★
()
Ответ на: комментарий от MKuznetsov

а оригинальный оригинал влез

тут или ИИ туп или Питон скатился в УГ :-) впрочем скорее оба варианта

Оригинал был для IRIX'овой GL 1991-го года и использовал файлы, которых сейчас нет (или qwen решил, что нет), nurbsdata.py отсутствует. Так что при подобном портировании могло и разбухнуть.

anonymous_incognito ★★★★★
()
Ответ на: комментарий от Stanson

Не существует никакого ИИ. Вообще никакого. Есть только трейдмарк ИИ™, который как водится, мухлёж в чистом виде.

Тем не менее термин прижился и все понимают о чём речь идёт. На самом деле критерии, что считать ИИ всё время отодвигаются. Тест Тьюринга нынешние модели уже давно проходят.

Тупая нейросеть принципиально не может понять что делает код, поэтому никакой увернности в результате не может быть никогда.

На практике она как раз нередко понимает, вплоть до того, что можно подсунуть обфусцированный код и попросить объяснить, что это.

Например:

Что делает этот обфусцированный код на JavaScript?  Преобразуй его в нормальный, если можешь

(![]+[])[+!+[]]+(![]+[])[!+[]+!+[]]+(!![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+!+[]]+(!![]+[])[+[]]+([][(![]+[])[+[]]+(![]+[])[!+[]+!+[]]+(![]+[])[+!+[]]+(!![]+[])[+[]]]+[])[+!+[]+[!+[]+!+[]+!+[]]]+[+!+[]]+([+[]]+![]+[][(![]+[])[+[]]+(![]+[])[!+[]+!+[]]+(![]+[])[+!+[]]+(!![]+[])[+[]]])[!+[]+!+[]+[+[]]]

Справился.

Этот обфусцированный JavaScript-код формирует строку alert(1), используя хитрые преобразования типов и доступ к символам через индексы. Вот как это работает:
🔍 Пошаговая деобфускация:
Каждая часть кода извлекает отдельный символ, опираясь на приведение типов:

    ![] → false (т.к. [] в булевом контексте true, !true = false)
    !![] → true (двойное отрицание)
    +!+[] → 1 (т.к. +[] = 0, !0 = true, +true = 1)
    !+[]+!+[] → 2 (аналогично)

🧩 Разбор ключевых фрагментов:

    (![]+[])[+!+[]]
    → "false"[1] → "a"
    (![]+[])[!+[]+!+[]]
    → "false"[2] → "l"
    (!![]+[])[!+[]+!+[]+!+[]]
    → "true"[3] → "e"
    (!![]+[])[+!+[]]
    → "true"[1] → "r"
    (!![]+[])[+[]]
    → "true"[0] → "t"
    ([][...]+[])[+!+[]+[!+[]+!+[]+!+[]]]
    Здесь ... = 'flat' (собирается из f+l+a+t через те же трюки).
    → Array.prototype.flat.toString()[13] → "("
    (Строка вида "function flat() { [native code] }" → 13-й символ — ()
    +[+!+[]]
    → +[1] → "1" (приведение к строке)
    ([+[]]+![]+[][...])[!+[]+!+[]+[+[]]]
    → ("0" + "false" + "[object Array]")[20] → ")"
    (Строка "0false[object Array]" → 20-й символ — ))
anonymous_incognito ★★★★★
()
Ответ на: комментарий от anonymous_incognito

Тем не менее термин прижился и все понимают о чём речь идёт.

Прижился этот «термин» только среди конченных дебилов и потребителей маркетоидного бреда.

можно подсунуть обфусцированный код и попросить объяснить, что это.

Двойная работа же - один хер придётся разбираться что на самом деле делает обфусцированный код, а потом ещё и разбираться правильно ли что-то там эта сраная нейросетка нагаллюцинировала.

Это же полнейший дебилизм.

ЗЫ: И хватит уже засирать ЛОР нейрослопной копипастой.

Stanson ★★★★★
()
Последнее исправление: Stanson (всего исправлений: 1)
Ответ на: комментарий от anonymous_incognito

Оригинал был для IRIX'овой GL 1991-го года и использовал файлы, которых сейчас нет (или qwen решил, что нет), nurbsdata.py отсутствует. Так что при подобном портировании могло и разбухнуть.

откройте, в VScode например, слева оригинал а справа портированное нечто. Сравните и ощутите разницу - код стал не просто длиннее, а говнее

MKuznetsov ★★★★★
()
Последнее исправление: MKuznetsov (всего исправлений: 1)
Ответ на: комментарий от seiken

Дилетантам от программирования очень понравился. С тех пор ничего не изменилось, и сейчас это на 100% язык тестеров и говнокодеров.

quwy
()
Ответ на: комментарий от seiken

Как так получилось, что питон выстрелил гораздо громче, чем рубин?

machine learning сильно помог. Numpy/Pytorch достаточно уникальные продукты, тот же R так и проиграл гонку.

error_
()
Ответ на: комментарий от byko3y

интересы корпы разработавшей целенаправленно язык повышающая взаимозаменяемость батраков-программистов путём как упрощением входа так и унификацией форматирования для увеличения пула батраков способных закрывать бизнес задачи

т.е. корпа добра сделала добро себе и бангалорцам без полного среднего образования

qulinxao3 ★☆
()

И теперь сотни тысяч разработчиков мучаются, в глаза бы этот python не видеть.

masa ★★★
()
Закрыто добавление комментариев для недавно зарегистрированных пользователей (со score < 50)