Render natively in Poincaré.

This commit is contained in:
bʰedoh₂ swé 2024-04-04 21:05:20 +05:00
parent 380b9f96a4
commit f7ee5715c7
2 changed files with 45 additions and 10 deletions

33
gyro.py
View File

@ -3,6 +3,10 @@ try:
except ImportError:
from numpy import complex128 as complex256
from cmath import sqrt
from math import tanh, atanh
from lines import cLineIntersection
def ZeroCheck(cN):
if cN == complex256(complex(0,0)):
return complex256(complex(1,0))
@ -21,6 +25,9 @@ def cDot(cA, cB):
def cDist(cA, cB):
return abs(cA-cB)
def MobiusInt(cA,cB,cC,cD): # Bruh
return Klein2Poincare(cLineIntersection(Poincare2Klein(cA),Poincare2Klein(cB),Poincare2Klein(cC),Poincare2Klein(cD)))
def MobiusAdd(cA, cB):
return (cA + cB) / (1 + cA.conjugate() * cB)
@ -30,9 +37,32 @@ def MobiusGyr(cA, cB):
def MobiusAddGyr(cA, cB):
return MobiusAdd(cA, cB), MobiusGyr(cA, cB)
def MobiusScalar(cA, rT):
m = abs(cA)
return tanh(rT * atanh(m)) * cA / m
def MobiusCoadd(cA,cB):
return MobiusAdd(cA, (MobiusGyr(cA,-cB) * cB))
def MobiusCosub(cA,cB):
return MobiusAdd(cA, -(MobiusGyr(cA,cB) * cB))
def MobiusLine(cA,cB,rT):
return MobiusAdd(
cA,
MobiusScalar(
MobiusAdd(-cA,cB),
rT))
def MobiusDist(cA,cB):
return abs(MobiusAdd(-cB,cA))
def Poincare2Klein(cN):
return 2*cN / (1 + cDot(cN,cN))
def Klein2Poincare(cN):
return (1-sqrt(1-cDot(cN,cN)))*cN/cDot(cN,cN)
class GyroVector:
def __init__(self, cPos, cRot):
self.cPos = complex256(cPos)
@ -74,3 +104,6 @@ class GyroVector:
def nrtransformed(self, cA):
return MobiusAdd(self.cPos, cA / self.cRot)
def dist(self,gA):
return abs((-self+gA).cPos)

22
main.py
View File

@ -24,6 +24,8 @@ IROT = 1/ROT
F = 5 * 10**7
F_ = 10**9
gOrigin = GyroVector(complex256(0),1)
SKY = (127,127,255)
GROUND = (102, 51, 0)
@ -54,16 +56,16 @@ def draw(level,gPlayer,fov,res):
m = DrawnSegment(0,BLACK)
rot = irot**(i-(res/2)) * iprot
for j in level:
tA = Poincare2Klein(MobiusAdd(j.pointA,-gPlayer.cPos))
tB = Poincare2Klein(MobiusAdd(j.pointB,-gPlayer.cPos))
try: # This function faults from time to time
cInt = cLineIntersection(tA,tB,complex256(0),rot)
#tA = MobiusAdd(j.pointA,-gPlayer.cPos)
#tB = MobiusAdd(j.pointB,-gPlayer.cPos)
try: # Function "LineIntersection" faults from time to time
cInt = MobiusInt(j.pointA,j.pointB,gPlayer.cPos,rot)
except ZeroDivisionError:
continue
rDist = cDist(0,cInt) * irot.real
if not (j.isFinite and cBetween(tA,tB,cInt)):
if cDot(rot,MobiusAdd(cInt,-gPlayer.cPos)) > 0:
continue
if cDot(cInt,rot) > 0:
rDist = MobiusDist(cInt,gPlayer.cPos)
if not (j.isFinite and cBetween(j.pointA,j.pointB,cInt)):
continue
if (1 - m.height) > rDist:
m = DrawnSegment(1-rDist,j.color)
@ -116,13 +118,13 @@ def mainLoop():
display.fill(WHITE)
#pygame.draw.rect(display,BLACK, c_tr(Poincare2Klein(gPlayer.cPos) * -100) + (100,100),0)
drawn = draw(level,gPlayer,PI/2,160)
drawn = draw(level,gPlayer,PI/4,320)
pygame.draw.rect(display,SKY, (0,0,1280,360))
pygame.draw.rect(display,GROUND, (0,360,1280,360))
n = 0
for i in drawn:
pygame.draw.rect(display,i.color, (n,(1 - i.height) * 360,8,cap(i.height) * 1280))
n += 8
pygame.draw.rect(display,i.color, (n,int((1 - cap(i.height)) * 360),8,int(cap(i.height) * 1280)))
n += 4
if debugInfo:
fps_surf, cPos_surf, cRot_surf = renderDebugInfo(gPlayer, clock, fontSize)