Rem Project: NormalMap
Rem Created: Thursday, April 25, 2013
remstart ^For that Normal Method it would be better to use
6 bit R,8 bit x ,8 bit y,5 bit A,5it B,20bit phixzect.,Qx, Qy,Qz
6.125 Bytes ~33771Polygons in 202KiloBytes (202*1024/4.625)
UintXCos(A,B,C,D,Type) 6.5MB(2^5*2^*2^5*2^5*2^5*4*1.625*/1024/1024)
Uintconvtoxyz(A,B,qx,qy,qz) = 8 KB
asincos(R) Rlength (6 bit/8) .75Bytes
FRRatio(R1#,R2#) Represented as about 8.41(represented as 9 bits) bits(R1#/R2#),(R1#,R3)=576KB (2^6*2^6*2^6*18/8/1024)
F(A,A2,Qx,Qz,Q2x,Q2z,RRatio)=~6MB (2^5*2^5*2^4*342*9/8)
Normal=CrossCos(Angle1,Q1,Angle2,Q2)
Tangent=[1,angle1,angle2]
Keep track of rotation and rotate so Angle=0,0
find the tangent of the values the axis of the 1 vector is not on of the other vector
assign a value adding negating QX if QX=QX else on QY -1,1(subtracting 1 for unsigned int)
Cross = ATan(sin(Theta-Theta2)/tan(Beta-Beta2))+90degrees
x=(-)cos(Cross)sin(Theta2)
y=cos(Cross)cos(Theta2)
z=sin(Cross)
1/tan(Cross)*sin(Theta2)
1/tan(Cross)*cos(Theta2)
G=Alpha=Theta
H=BetaX=Theta2
I=Gamma=0
Sin(Cross)cos(H)cos(I)+Sin(Cross)cos(H)cos(I)
x/z=tan(T)
y/z=tan(B)
x/y=Ftan(T,B)
z/y=Itan(B)
y/x=IFtan(T,B)
z/x=Itan(T)
Zdiff#=(RSratio#*cos(bitang(Ang2)*QK)-(sin(bitang(Ang1))*QZ*cos(bitang(Ang4))))
Zdiff#=(RSratio#*cos(bitang(Ang2)*QK)-(sin(bitang(Ang1))*QZ*cos(bitang(Ang4))))
ANS=INT(32/90.0*ACOS(ABS(Zdiff#/(sin(bitang(Ang3))+((RSratio#*RSratio#)/Sin(bitang(Ang3)))-(2*RSratio#*(LNQ*64))))))
Zdiff,Ang3,RsRatio,LNQ
ANS=INT(ATAN(((RSratio#/Sin(90.0*Ang3/32))*sin(90.0*Ang2/32)-sin(90.0*Ang4/32))/((RSratio#*cos(90.0*Ang2/32)/Sin(90.0*Ang3/32)-cos(90.0*Ang4/32))))/90*32)
remend
Rem ***** Main Source File *****
Rem Max is sixbit combined value taking advantage of impossible combinations.
text 0,0,\"good\"
wait key
global LightPhi,LightTheta,LightX,LightY,LightZ
global Ang1,Ang2,Ang3,Ang4
global CrossPhi,CrossTheta
global QX,QY,QZ,QI,QJ,QK,QA,QB,QC
global Rratio,SRratio,SinCosQ,CosRatio
global R1,R2
R1=1
R2=1
QX=1
QY=1
QZ=1
QI=1
QJ=1
QK=1
#Constant 1DQUAD=2
#Constant 2DQUAD=4
#CONSTANT B256Q=256
#CONSTANT B128Q=128
#CONSTANT RatioPercision=64
#CONSTANT SinQPercision=65
#CONSTANT TYPENUM=24
#CONSTANT DEF=101
#CONSTANT VECTORNUM=6
Power#=5.0/3.0
PowerB#=1.0/3.0
PowerC#=59.0/23.0
LightPhi=16
LightTheta=120
LightX=1
LightY=1
LightZ=1
Global DIM SinCOSQQQ(B256Q,B256Q,2DQUAD)
Global DIM ANGAverage(B256Q,B256Q,2DQUAD)
rem Phi Average and Theta aver reduced percision
rem Approximate RRatio and SSRatio with cubic rounded out from 128
rem Approximate SinCosQQQ with (x)^3 from 1 to -1*32+32 could be change to odd powers like x^(5/3)
rem Approximate DotValue with 6 Bit Angle
Rem Arc Equation is Cross Product unit vector
Rem Approximate Zdiff Linearly
Global Dim CrossProductPhi(B256Q,B256Q,2)
Global DIM ArcEquation(RatioPercision,RatioPercision,B256Q)
Global DIM ArcDifEquation(RatioPercision,RatioPercision,B256Q)
Global DIM DotProduct(B256Q,B256Q,SinQPercision)
Global DIM CosRratio(B256Q,RatioPercision)
Global DIM Zdiff(RatioPercision,B256Q,1DQUAD)
Global DIM SolvePhi(B256Q,RatioPercision,RatioPercision,2DQUAD)
Global DIM RRatio(B256Q,B256Q)
Global DIM SSRatio(B256Q,B256Q,RatioPercision)
Global DIM SolveTheta(RatioPercision,RatioPercision,RatioPercision,1DQUAD)
Global DIM Vectorpos(DEF,DEF,VECTORNUM)
Global DIM ImageRed(DEF,DEF)
Global DIM ImageGreen(DEF,DEF)
Global DIM ImageBlue(DEF,DEF)
Global DIM FindNormalTexture(RatioPercision,RatioPercision,B256Q)
ShowThisOneX=3
ShowThisOneY=25
for PC=0 to B256Q-1
for VG=0 to B256Q-1
ANGAverage(VG,PC,0)=INT((PC+VG)/8.0)
ANGAverage(VG,PC,1)=INT((PC+VG+90)/8.0)
ANGAverage(VG,PC,3)=INT((PC+VG)/2.0)
ANGAverage(VG,PC,2)=INT((PC-VG+90)/8.0)
CrossProductPhi(PC,VG,0)=INT(256.0/90.0*ATAN(tan(PC*90.0/256.0)/tan(VG*90.0/256.0)))
CrossProductPhi(PC,VG,1)=INT(256.0/90.0*ATAN(tan(PC*90.0/256.0)/tan(VG*90.0/256.0)))
next VG
next PC
for MAC=0 to B256Q-1
for UBTU=0 to 63
for PHIAVER=0 to 63
rem Can get negative and positive from manipulating the angle
ArcEquation(PHIAVER,UBTU,MAC)=INT(ATAN(-1/(Tan(UBTU*90/128.0)*cos(PHIAVER*90/64.0)*Cos(MAC*90/256.0)+Tan(UBTU*90/128.0)*sin(PHIAVER*90/64.0)*Sin(MAC*90/256.0))))
ArcDifEquation(PHIAVER,UBTU,MAC)=INT(ATAN(-1/(Tan(UBTU*90/128.0)*cos(PHIAVER*90/64.0)*Cos(MAC*90/256.0)-Tan(UBTU*90/128.0)*sin(PHIAVER*90/64.0)*Sin(MAC*90/256.0))))
FindNormalTexture(PHIAVER,UBTU,MAC)=INT(cos(PHIAVER*90/64.0)*MAC/cos(UBTU*90/64.0))
Next PHIAVER
Next MAC
Next UBTU
for GW=0 to B256Q-1
for GE=0 to B256Q-1
QQQA#=(sin(GW*90/256.0)*sin(GE*90/256.0))+(Cos(GW*90/256.0)*Cos(GE*90/256.0))
QQQB#=(sin(GW*90/256.0)*sin(GE*90/256.0))-(Cos(GW*90/256.0)*Cos(GE*90/256.0))
QQQC#=(-1*sin(GW*90/256.0)*sin(GE*90/256.0))-(Cos(GW*90/256.0)*Cos(GE*90/256.0))
QQQD#=(-1*sin(GW*90/256.0)*sin(GE*90/256.0))+(Cos(GW*90/256.0)*Cos(GE*90/256.0))
SinCOSQQQ(B256Q,B256Q,0)=INT((QQQA#^(Power#))*32.0/3.1748021039363989495034112785446)+32
SinCOSQQQ(B256Q,B256Q,1)=INT((QQQB#^(Power#))*32.0/3.1748021039363989495034112785446)+32
SinCOSQQQ(B256Q,B256Q,2)=INT((QQQC#^(Power#))*32.0/3.1748021039363989495034112785446)+32
SinCOSQQQ(B256Q,B256Q,3)=INT((QQQD#^(Power#))*32.0/3.1748021039363989495034112785446)+32
next GE
next GW
for SinVALE=0 to SinQPercision-1
for GPW=0 to B256Q-1
for GPE=0 to B256Q-1
ANSQ#=cos(GPW*90/256.0)*cos(GPE*90/256.0)+((SinVALE-32)*3.1748021039363989495034112785446/32.0)^(1/Power#)*sin(GPW*90/256.0)*sin(GPE*90/256.0)
DotProduct(GPW,GPE,SinVALE)=INT((ACOS(ANSQ#)%%90)*64.0/90.0)
next GPE
next GPW
next SinVALE
Range#=2*5.0396841995794926590688424291129
for MACB=0 to B256Q-1
for UBTUA=0 to B256Q-1
if UBTUA>0
RRatio#=MACB/UBTUA
else
RRatio#=256
endif
rem y=(x-5.0396841995794926590688424291129)^3+128
RRatio(MACB,UBTUA)=INT((64.0/Range#)*(((RRatio#-128)^(PowerB#))+5.0396841995794926590688424291129))
next UBTUA
next MACB
remstart
for PCX=0 to 63
for MACQQ=0 to B256Q-1
for UBTUQQ=0 to B256Q-1
SSRatio(MACQQ,UBTUQQ,PCX)=((((Range#/64)*PCX)-5.0396841995794926590688424291129)^(1/PowerB#))
next UBTUQQ
next MACQQ
next PCX
remend
for MAC2000=0 to B256Q-1
for UBTU2000=0 to 63
CosRratio(MAC2000,UBTU2000,0)=INT(cos(MAC2000*90/256.0)*(UBTU2000))
next MAC2000
next UBTU2000
for MAC2014=0 to B256Q-1
for UBTU2014=0 to 63
QQQA#=(((((Range#/64)*UBTU2014)-5.0396841995794926590688424291129)^(1/PowerB#))+128-Cos(MAC2014*90/256.0))
QQQB#=(((((Range#/64)*UBTU2014)-5.0396841995794926590688424291129)^(1/PowerB#))+128+Cos(MAC2014*90/256.0))
Zdiff(UBTU2014,MAC2014,0)=INT((64.0/Range#)*((QQQA#-128)^(PowerB#)+5.0396841995794926590688424291129))
Zdiff(UBTU2014,MAC2014,1)=INT((64.0/Range#)*((QQQB#-128)^(PowerB#)+5.0396841995794926590688424291129))
next MAC2014
next UBTU2014
remstart
0=ln((41472-x)^1/x)-1
x=ln((41472-x))
remend
rem 10.63
rem 64^x=41472
for PCXX=0 to 63
for MAC2012=0 to B256Q-1
for UBTU2012=0 to B256Q-1
SSRatio(MAC2012,UBTU2012,PCXX)=INT((Sin(MAC2012*90/256.0)/Sin(UBTU2012*90/256.0)*(((((Range#/64)*PCXX)-5.0396841995794926590688424291129)^(1/PowerB#))+128))^(1/PowerC#))
next MAC2012
next UBTU2012
next PCXX
for PCY=0 to RatioPercision-1
for MAC2020=0 to B256Q-1
for UBTU2020=0 to RatioPercision-1
SolvePhi(MAC2020,UBTU2020,PCY,0)=INT(ATAN(((PCY^PowerC#)*sin(90.0*MAC2020/256)-sin(90.0*UBTU2020/128))/((((PCY^PowerC#))*cos(90.0*MAC2020/256)-cos(90.0*UBTU2020/256))))/90*256)
SolvePhi(MAC2020,UBTU2020,PCY,1)=INT(ATAN(((PCY^PowerC#)*sin(90.0*MAC2020/256)+sin(90.0*UBTU2020/128))/((((PCY^PowerC#))*cos(90.0*MAC2020/256)+cos(90.0*UBTU2020/256))))/90*256)
SolvePhi(MAC2020,UBTU2020,PCY,2)=INT(ATAN(((PCY^PowerC#)*sin(90.0*MAC2020/256)+sin(90.0*UBTU2020/128))/((((PCY^PowerC#))*cos(90.0*MAC2020/256)-cos(90.0*UBTU2020/256))))/90*256)
SolvePhi(MAC2020,UBTU2020,PCY,3)=INT(ATAN(((PCY^PowerC#)*sin(90.0*MAC2020/256)-sin(90.0*UBTU2020/128))/((((PCY^PowerC#))*cos(90.0*MAC2020/256)+cos(90.0*UBTU2020/256))))/90*256)
next PCY
next MAC2020
next UBTU2020
for PCZ=0 to RatioPercision-1
for MAC2121=0 to RatioPercision-1
for UBTU2121=0 to RatioPercision-1
SolveTheta(MAC2121,UBTU2121,PCZ,0)=INT(256/90.0*ACOS(ABS(((((Range#/64)*UBTU2121)-5.0396841995794926590688424291129)^(1/PowerB#)))/(1+((((((Range#/64)*PCZ)-5.0396841995794926590688424291129)^(1/PowerB#))*((((Range#/64)*PCZ)-5.0396841995794926590688424291129)^(1/PowerB#))))-(2*((((Range#/64)*PCZ)-5.0396841995794926590688424291129)^(1/PowerB#))*(Cos(MAC2121*90.0/64.0)*64)))))
SolveTheta(MAC2121,UBTU2121,PCZ,1)=INT(256/90.0*ACOS(ABS(((((Range#/64)*UBTU2121)-5.0396841995794926590688424291129)^(1/PowerB#)))/(1+((((((Range#/64)*PCZ)-5.0396841995794926590688424291129)^(1/PowerB#))*((((Range#/64)*PCZ)-5.0396841995794926590688424291129)^(1/PowerB#))))+(2*((((Range#/64)*PCZ)-5.0396841995794926590688424291129)^(1/PowerB#))*(Cos(MAC2121*90.0/64.0)*64)))))
next PCZ
next MAC2121
next UBTU2121
for SDG =0 to 100
for SDHC =0 to 100
GX#=10*SDG
GY#=1000-10*SDHC
GZ#=50.0
RTY#=sqrt(GX#^2+GY#^2+GZ#^2)
Ans=INT(ABS((ATAN(GY#/GX#)/90.0)*256.0))
Vectorpos(SDG,SDHC,0)=Ans
Ans=INT(ABS(ACOS(ABS(GZ#/RTY#))/90.0*256.0))
Vectorpos(SDG,SDHC,1)=Ans
rem reduces max R to 256
Ans=INT(ABS(RTY#/27.621358640099512671907982894721))
Vectorpos(SDG,SDHC,2)=Ans
Ans=INT(ABS(GX#)/GX#)
Vectorpos(SDG,SDHC,3)=Ans
Ans=INT(ABS(GY#)/GY#)
Vectorpos(SDG,SDHC,4)=Ans
Ans=INT(ABS(GZ#)/GZ#)
Vectorpos(SDG,SDHC,5)=Ans
next SDHC
next SDG
load bitmap \"C:\\Program Files\\The Game Creators\\Dark Basic Pro Free\\Dark Basic Pro\\Projects\\NMAP2\\Vash Nmap Small.bmp\"
lock pixels
for UUGH =0 to 100
for UUGY =0 to 100
ImageRed(UUGH,UUGY)=RGBR(Point(UUGH,UUGY))
ImageGreen(UUGH,UUGY)=RGBG(Point(UUGH,UUGY))
Next UUGH
Next UUGY
unlock pixels
Doneit=0
rem left is normal map
ThetaGH=0
PhiGH=0
AGH=0
BGH=0
CGH=0
AGY=0
BGY=0
CGY=0
ThetaGY=0
PhiGY=0
NormalPhi=0
NormalTheta=0
NormA=0
NormB=0
NormC=0
CRED=0
CGREEN=0
CBLUE=0
FinalPhi=0
FinalTheta=0
FinalGreen=0
FinalRed=0
FinalBlue=0
LastCountGH=0
LastCountGY=0
if file exist(\"C:\\Program Files\\The Game Creators\\Dark Basic Pro Free\\Dark Basic Pro\\Projects\\NMAP2\\importantvalues.txt\") then delete file \"C:\\Program Files\\The Game Creators\\Dark Basic Pro Free\\Dark Basic Pro\\Projects\\NMAP2\\importantvalues.txt\"
OPEN TO WRITE 1, \"C:\\Program Files\\The Game Creators\\Dark Basic Pro Free\\Dark Basic Pro\\Projects\\NMAP2\\importantvalues.txt\"
for CountGH=1 to 100
for CountGY=1 to 100
R1=Vectorpos(LastCountGH,LastCountGY,2)
Ang2=Vectorpos(LastCountGH,LastCountGY,0)
Ang1=Vectorpos(LastCountGH,LastCountGY,1)
QX=Vectorpos(LastCountGH,LastCountGY,3)
QY=Vectorpos(LastCountGH,LastCountGY,4)
QZ=Vectorpos(LastCountGH,LastCountGY,5)
R2=Vectorpos(LastCountGH,CountGY,2)
Ang4=Vectorpos(LastCountGH,CountGY,0)
Ang3=Vectorpos(LastCountGH,CountGY,1)
QI=Vectorpos(LastCountGH,CountGY,3)
QJ=Vectorpos(LastCountGH,CountGY,4)
QK=Vectorpos(LastCountGH,CountGY,5)
if ShowThisOneX=CountGH
if ShowThisOneY=CountGY
hun$=\"Ang4:\"+Str$(Ang4)
Write String 1,hun$
hun$=\"Ang3:\"+Str$(Ang3)
Write String 1,hun$
hun$=\"R2:\"+Str$(R2)
Write String 1,hun$
hun$=\"Ang1:\"+Str$(Ang1)
Write String 1,hun$
hun$=\"Ang2:\"+Str$(Ang2)
Write String 1,hun$
hun$=\"R1:\"+Str$(R1)
Write String 1,hun$
endif
endif
SinRRatio()
PhiGH=SPhi()
ThetaGH=STheta()
if ShowThisOneX=CountGH
if ShowThisOneY=CountGY
hun$=\"PhiGH:\"+Str$(PhiGH)
Write String 1,hun$
hun$=\"ThetaGH:\"+Str$(ThetaGH)
Write String 1,hun$
endif
endif
AGH=QA
BGH=QB
CGH=QC
R2=Vectorpos(CountGH,LastCountGY,2)
Ang4=Vectorpos(CountGH,LastCountGY,0)
Ang3=Vectorpos(CountGH,LastCountGY,1)
QI=Vectorpos(CountGH,LastCountGY,3)
QJ=Vectorpos(CountGH,LastCountGY,4)
QK=Vectorpos(CountGH,LastCountGY,5)
SinRRatio()
PhiGY=SPhi()
ThetaGY=STheta()
AGY=QA
BGY=QB
CGY=QC
rem but this comes out wrong so:
AGY=-1
BGY=-1
rem end of alteration
if ShowThisOneX=CountGH
if ShowThisOneY=CountGY
hun$=\"GYQuadX:\"+Str$(AGY)
Write String 1,hun$
hun$=\"GYQuadY:\"+Str$(BGY)
Write String 1,hun$
hun$=\"GYQuadZ:\"+Str$(CGY)
Write String 1,hun$
endif
endif
Ang4=PhiGY
Ang3=ThetaGY
Ang2=PhiGH
Ang1=ThetaGH
if ShowThisOneX=CountGH
if ShowThisOneY=CountGY
hun$=\"PhiGY:\"+Str$(PhiGY)
Write String 1,hun$
hun$=\"ThetaGY:\"+Str$(ThetaGY)
Write String 1,hun$
endif
endif
QI=QA
QJ=QB
QK=QC
QX=AGH
QY=BGH
QZ=CGH
rem but this comes out wrong so:
QY=-1
QX=-1
AGH=-1
BGH=-1
rem end of alteration
if ShowThisOneX=CountGH
if ShowThisOneY=CountGY
hun$=\"GHQuadX:\"+Str$(AGH)
Write String 1,hun$
hun$=\"GHQuadY:\"+Str$(BGH)
Write String 1,hun$
hun$=\"GHQuadZ:\"+Str$(CGH)
Write String 1,hun$
endif
endif
Getcrossproduct()
NormalPhi=CrossPhi
NormalTheta=CrossTheta
if ShowThisOneX=CountGH
if ShowThisOneY=CountGY
hun$=\"PhiN:\"+Str$(NormalPhi)
Write String 1,hun$
hun$=\"ThetaN:\"+Str$(NormalTheta)
Write String 1,hun$
endif
endif
NormA=QA
NormB=QB
NormC=QC
if ShowThisOneX=CountGH
if ShowThisOneY=CountGY
hun$=\"NormX:\"+Str$(NormA)
Write String 1,hun$
hun$=\"NormY:\"+Str$(NormB)
Write String 1,hun$
hun$=\"NormZ:\"+Str$(NormC)
Write String 1,hun$
endif
endif
Ang1=CrossTheta
Ang2=CrossPhi
Ang3=ThetaGH
Ang4=PhiGH
QX=NormA
QY=NormB
QZ=NormC
QI=AGH
QJ=BGH
QK=CGH
Getcrossproduct()
R1=(ImageRed(CountGH,CountGY)-128)
R2=(ImageGreen(CountGH,CountGY)-128)
if ShowThisOneX=CountGH
if ShowThisOneY=CountGY
hun$=\"R1:\"+Str$(R1)
Write String 1,hun$
hun$=\"R2:\"+Str$(R2)
Write String 1,hun$
endif
endif
REM Found Binormal
Ang1=CrossTheta
Ang2=CrossPhi
Ang3=ThetaGH
Ang4=PhiGH
QX=QA
QY=QB
QZ=QC
QI=AGH
QJ=BGH
QK=CGH
SinRRatio()
FinalPhi=SPhi()
FinalTheta=STheta()
if ShowThisOneX=CountGH
if ShowThisOneY=CountGY
hun$=\"FinalPhi:\"+Str$(FinalPhi)
Write String 1,hun$
hun$=\"FinalThet:\"+Str$(FinalTheta)
Write String 1,hun$
endif
endif
QX=QA
QY=QB
QZ=QC
Ang3=Vectorpos(LastCountGH,LastCountGY,0)
Ang4=Vectorpos(LastCountGH,LastCountGY,1)
QI=Vectorpos(LastCountGH,LastCountGY,3)
QJ=Vectorpos(LastCountGH,LastCountGY,4)
QK=Vectorpos(LastCountGH,LastCountGY,5)
Ang1=FinalTheta
Ang2=FinalPhi
Ang3=Vectorpos(LastCountGH,LastCountGY,0)
Ang4=Vectorpos(LastCountGH,LastCountGY,1)
finddotproduct()
ImageRed(CountGH,CountGY)=SinCosQ
Ang1=NormalTheta
Ang2=NormalPhi
Ang3=Vectorpos(LastCountGH,LastCountGY,0)
Ang4=Vectorpos(LastCountGH,LastCountGY,1)
QX=NormA
QY=NormB
QZ=NormC
QI=Vectorpos(LastCountGH,LastCountGY,3)
QJ=Vectorpos(LastCountGH,LastCountGY,4)
QK=Vectorpos(LastCountGH,LastCountGY,5)
if ShowThisOneX=CountGH
if ShowThisOneY=CountGY
hun$=\"One:\"+Str$(SinCosQ)
Write String 1,hun$
endif
endif
finddotproduct()
ImageGreen(CountGH,CountGY)=SinCosQ
if ShowThisOneX=CountGH
if ShowThisOneY=CountGY
hun$=\"Two:\"+Str$(SinCosQ)
Write String 1,hun$
endif
endif
LastCountGH=CountGH
LastCountGY=CountGY
next CountGY
next CountGH
cls
load bitmap \"C:\\Program Files\\The Game Creators\\Dark Basic Pro Free\\Dark Basic Pro\\Projects\\NMAP2\\Vash Image.bmp\"
For CounGH= 0 to 100
For CounGY= 0 to 100
CRED=RGBR(Point(CounGH,CounGY))
CGREEN=RGBG(Point(CounGH,CounGY))
CBLUE=RGBB(Point(CounGH,CounGY))
if ImageGreen(CounGH,CounGY)>0
if ImageRed(CounGH,CounGY)>63 then ImageRed(CounGH,CounGY)=63
if ImageGreen(CounGH,CounGY)>63 then ImageGreen(CounGH,CounGY)=63
if ImageRed(CounGH,CounGY)<0 then ImageRed(CounGH,CounGY)=0
CGREEN=FindNormalTexture(ImageRed(CounGH,CounGY),ImageGreen(CounGH,CounGY),CGREEN)
CBLUE=FindNormalTexture(ImageRed(CounGH,CounGY),ImageGreen(CounGH,CounGY),CBLUE)
CRED=FindNormalTexture(ImageRed(CounGH,CounGY),ImageGreen(CounGH,CounGY),CRED)
else
CGREEN=125
CRED=125
CBLUE=125
endif
if CGREEN>255
CGREEN=255
endif
if CGREEN<0
CGREEN=0
endif
if CRED>255
CRED=255
endif
if CRED<0
CRED=0
endif
if CBLUE>255
CBLUE=255
endif
if CBLUE<0
CBLUE=0
endif
Dot 540+CounGH,CounGY,RGB(CRED,CGREEN,CBLUE)
Next CounGY
Next CounGH
wait key
wait key
END
function Getcrossproduct()
QR=QX*QY
QS=QI*QJ
if Ang4>255 or Ang4<0
Ang4=0
endif
if Ang3>255 or Ang3<0
Ang3=0
endif
if Ang2>255 or Ang2<0
Ang2=0
endif
if Ang1>255 or Ang1<0
Ang1=0
endif
if (QX*QY)=(QI*QJ)
CrossPhi=CrossProductPhi(Ang2,Ang4,0)
else
CrossPhi=CrossProductPhi(Ang2,Ang4,1)
endif
if (QX=QI) and (QY=QJ)
PAV=ANGAverage(Ang2,Ang4,0)
else
PAV=ANGAverage(Ang2,Ang4,1)
endif
if (QZ=QK) and ((QR)=(QS))
TAV=ANGAverage(Ang1,Ang3,0)
else
TAV=ANGAverage(Ang1,Ang3,1)
endif
QAA=QI
QAB=QJ
if QX=-QI and QY=-QJ
if ANGAverage(Ang1,An3,2)>44
QAA=QI
QAB=QY
else
QAA=QX
QAB=QJ
endif
else
if (ANGAverage(Ang1,An3,0)>45)
if (QX=QY and QX=-QI) or (QX=-QY and QY=-QJ)
QAA=QX
QAB=QY
endif
endif
endif
QAC=QK
QAD=QJ*QI
if QZ=-QK and QR=-QS
if ANGAverage(Ang2,An4,2)>44
QAC=QK
QAD=QR
else
QAC=QZ
QAD=QS
endif
else
if (ANGAverage(Ang2,An4,0)>45)
if (QZ=QR and QZ=-QK) or (QZ=-QR and QR=-QS)
QAC=QZ
QAD=QR
endif
endif
endif
BolA=QAA*QAC
BolB=QAB*QAC
if (BolA=BolB)
CrossTheta=ArcEquation(TAV,PAV,CrossPhi)
else
CrossTheta=ArcDifEquation(TAV,PAV,CrossPhi)
endif
if (BolA=-1)
CrossTheta=256-CrossTheta
endif
QA=QAA
QB=QAB
QC=QAC
endfunction
function SinRRatio()
if Ang4>255 or Ang4<0
Ang4=0
endif
if Ang3>255 or Ang3<0
Ang3=0
endif
if Ang2>255 or Ang2<0
Ang2=0
endif
if Ang1>255 or Ang1<0
Ang1=0
endif
if R1>256 then R1=256
if R1<0 then R1=0
if R2>256 then R2=256
if R2<0 then R2=0
Rratio=RRatio(R1,R2)
if Rratio<0 then Rratio=0
if Rratio>63 then Rratio=63
SSRatio=SSRatio(Ang3,Ang1,Rratio)
endFunction
Function SPhi()
if Ang4>255 or Ang4<0
Ang4=0
endif
if Ang3>255 or Ang3<0
Ang3=0
endif
if Ang2>255 or Ang2<0
Ang2=0
endif
if Ang1>255 or Ang1<0
Ang1=0
endif
Reduced=ANGAverage(Ang4,Ang4,0)
Rem if statements
if (QX=QI)
if (QY=QJ)
ANS=SolvePhi(Ang2,Reduced,SSRatio,0)
else
ANS=SolvePhi(Ang2,Reduced,SSRatio,3)
endif
else
if (QY=QJ)
ANS=SolvePhi(Ang2,Reduced,SSRatio,1)
else
ANS=SolvePhi(Ang2,Reduced,SSRatio,2)
endif
endif
If (QX=-1)
if (QY=1)
ANS=256-ANS
endif
else
If (QY=-1)
ANS=256-ANS
endif
endif
QB=1
if (QY=QJ)
if QY=1 and R1*sin(bitang(Ang1))*sin(bitang(Ang2))<R2*sin(bitang(Ang3))*sin(bitang(Ang4))
QB=-1
endif
if QY=-1 and R1*sin(bitang(Ang1))*sin(bitang(Ang2))>R2*sin(bitang(Ang3))*sin(bitang(Ang4))
QB=-1
endif
else
if QY=-1
QB=-1
endif
endif
QA=1
if (QX=QI)
if QX=1 and R1*sin(bitang(Ang1))*cos(bitang(Ang2))<R2*sin(bitang(Ang3))*cos(bitang(Ang4))
QA=-1
endif
if QX=-1 and R1*sin(bitang(Ang1))*cos(bitang(Ang2))>R2*sin(bitang(Ang3))*cos(bitang(Ang4))
QA=-1
endif
else
if QX=-1
QA=-1
endif
endif
endfunction ANS
Function SUnitPhi()
rem put into an array in x and y later where x and y keep sign
IF QX*sin(bitang(Ang1))*cos(bitang(ang2))>QI*sin(bitang(Ang3))*cos(bitang(ang4))
QA=1
else
QA=-1
endif
IF QY*sin(bitang(Ang1))*sin(bitang(ang2))>QJ*sin(bitang(Ang3))*sin(bitang(ang4))
QB=1
else
QB=-1
endif
Remstart
y1 -1=0
x1 -1=180
y1 1=180
x1 1=-180
Remend
yq1=(QY+1)*90
xq1=(-QX)*180
xyqA=(xq1+yq1+180)/2
yq1=(QJ+1)*90
xq1=(-QK)*180
xyqB=(xq1+yq1+180)/2
ANS=(Ang2+xyqB+xyqA+Ang4)/2
if ANS>0 and ANS<130
ANS=ANS%%32
else
ANS=0
endif
endfunction ANS
Function SUnitTheta()
if Ang4>255 or Ang4<0
Ang4=0
endif
if Ang3>255 or Ang3<0
Ang3=0
endif
if Ang2>255 or Ang2<0
Ang2=0
endif
if Ang1>255 or Ang1<0
Ang1=0
endif
ANS=INT(256/90.0*ACOS(ABS(cos(bitang(Ang2))-cos(bitang(Ang4))/(2-2*(sin(bitang(Ang1))*cos(bitang(Ang2))*sin(bitang(Ang3))*cos(bitang(Ang4))+sin(bitang(Ang1))*sin(bitang(Ang2))*sin(bitang(Ang3))*sin(bitang(Ang4))+cos(bitang(Ang1))*cos(bitang(Ang3)))))))
if ANS>0 and ANS<130
ANS=ANS%%32
else
ANS=0
endif
endfunction ANS
Function STheta()
if Ang4>255 or Ang4<0
Ang4=0
endif
if Ang3>255 or Ang3<0
Ang3=0
endif
if Ang2>255 or Ang2<0
Ang2=0
endif
if Ang1>255 or Ang1<0
Ang1=0
endif
remstart
Global DIM SinCOSQQQ(B256Q,B256Q,2DQUAD)
Global DIM PhiAverage(B256Q,B256Q)
Global DIM ThetaAver(B256Q,B256Q)
rem Phi Average and Theta aver reduced percision
rem Approximate RRatio and SSRatio with cubic rounded out from 128
rem Approximate SinCosQQQ with (x)^3 from 1 to -1*32+32 could be change to odd powers like x^(5/3)
rem Approximate DotValue with 6 Bit Angle
Rem Arc Equation is Cross Product unit vector
Rem Approximate Zdiff Linearly
Global DIM ArcEquation(RatioPercision,RatioPercision,B256Q)
Global DIM ArcDifEquation(RatioPercision,RatioPercision,B256Q)
Global DIM DotProduct(B256Q,B256Q,SinQPercision)
Global DIM Zdiff(RatioPercision,B256Q,1DQuadrant)
Global DIM SolvePhi(B256Q,RatioPercision,RatioPercision,2DQUAD)
Global DIM RRatio(B256Q,B256Q)
Global DIM SSRatio(B256Q,B256Q,RatioPercision)
Global DIM SolveTheta(RatioPercision,RatioPercision,RatioPercision,1DQUAD)
Global DIM Vectorpos(DEF,DEF,VECTORNUM)
Global DIM ImageRed(DEF,DEF)
Global DIM ImageGreen(DEF,DEF)
Global DIM ImageBlue(DEF,DEF)
remend
finddotproduct()
Cosrate=CosRratio(Ang1,Rratio)
Rem If statements
if (QZ=QI)
ZdiffQ=Zdiff(Cosrate,Ang3,0)
else
ZdiffQ=Zdiff(Cosrate,Ang3,1)
endif
Rem If statements
if ZdiffQ>63 then ZdiffQ=63
if ZdiffQ<0 then ZdiffQ=0
if (QZ=1)
ANS=SolveTheta(SincosQ,ZdiffQ,Rratio,0)
else
ANS=SolveTheta(SincosQ,ZdiffQ,Rratio,1)
endif
QC=1
if (QZ=QK)
if QZ=1 and R1*cos(bitang(Ang1))<R2*cos(bitang(Ang3))
QC=-1
endif
if QZ=-1 and R1*cos(bitang(Ang1))>R2*cos(bitang(Ang3))
QC=-1
endif
else
if QZ=-1
QC=-1
endif
endif
endfunction ANS
function bitang(a)
Ans#=90.0*a/256.0
endfunction Ans#
function finddotproduct()
if Ang4>255 or Ang4<0
Ang4=0
endif
if Ang3>255 or Ang3<0
Ang3=0
endif
if Ang2>255 or Ang2<0
Ang2=0
endif
if Ang1>255 or Ang1<0
Ang1=0
endif
BolA=QX*QZ
BolB=QI*QK
BolC=QY*QZ
BolD=QJ*QK
if (BolA=BolB)
if (BolC=BolD)
SincosQ=SinCosQQQ(Ang2,Ang4,0)
else
SincosQ=SinCosQQQ(Ang2,Ang4,3)
endif
else
if (BolC=BolD)
SincosQ=SinCosQQQ(Ang2,Ang4,1)
else
SincosQ=SinCosQQQ(Ang2,Ang4,2)
endif
endif
SincosQ=DotProduct(Ang1,Ang3,SincosQ)
if SincosQ>64 then SincosQ=64
if SincosQ<0 then SincosQ=0
endfunction
Remstart
The Above is my issue it doesn\'t work it\'s to take advantage of the Fact that the Cross Product of Two Phi components are perpendicular to the Phi Plane so Phi is based on one variable.
The Below Works and calculates a Normal Map. Any Advice???
Remend
print \"good\"
wait key
global LightPhi,LightTheta,LightX,LightY,LightZ
global Ang1,Ang2,Ang3,Ang4
global CrossPhi,CrossTheta
global QX,QY,QZ,QI,QJ,QK,QA,QB,QC
global RSratio#
global LNQ
global R1#,R2#
#CONSTANT B32Q=32
#CONSTANT TYPENUM=24
#CONSTANT DEF=101
#CONSTANT VECTORNUM=6
LightPhi=2
LightTheta=15
LightX=1
LightY=1
LightZ=1
Global DIM CrossAns(B32Q,B32Q,B32Q,B32Q,TYPENUM)
Global DIM Thetax(B32Q,B32Q)
Global DIM Thetay(B32Q,B32Q)
Global DIM Vectorpos(DEF,DEF,VECTORNUM)
Global DIM ImageRed(DEF,DEF)
Global DIM ImageGreen(DEF,DEF)
Global DIM ImageBlue(DEF,DEF)
Global DIM Phizx(B32Q,B32Q)
Global DIM Phixy(B32Q,B32Q)
Global DIM Phizy(B32Q,B32Q)
Global DIM Phiyz(B32Q,B32Q)
Global DIM Phixz(B32Q,B32Q)
ShowThisOneX=3
ShowThisOneY=25
for SDG =0 to 100
for SDHC =0 to 100
GX#=10*SDG
GY#=1000-10*SDHC
GZ#=50.0
RTY#=sqrt(GX#^2+GY#^2+GZ#^2)
Ans=INT(ABS((ATAN(GY#/GX#)/90.0)*32.0))
Vectorpos(SDG,SDHC,0)=Ans
Ans=INT(ABS(ACOS(ABS(GZ#/RTY#))/90.0*32.0))
Vectorpos(SDG,SDHC,1)=Ans
Ans=INT(ABS(ln(RTY#)/ln(1.11)))
Vectorpos(SDG,SDHC,2)=Ans
Ans=INT(ABS(GX#)/GX#)
Vectorpos(SDG,SDHC,3)=Ans
Ans=INT(ABS(GY#)/GY#)
Vectorpos(SDG,SDHC,4)=Ans
Ans=INT(ABS(GZ#)/GZ#)
Vectorpos(SDG,SDHC,5)=Ans
next SDHC
next SDG
load bitmap \"C:\\Documents and Settings\\Owner\\My Documents\\My Pictures\\Vash Nmap Small.bmp\"
lock pixels
for UUGH =0 to 100
for UUGY =0 to 100
ImageRed(UUGH,UUGY)=RGBR(Point(UUGH,UUGY))
ImageGreen(UUGH,UUGY)=RGBG(Point(UUGH,UUGY))
Next UUGH
Next UUGY
unlock pixels
for LD=0 to 31
for LE=0 to 31
for LF=0 to 31
for LG=0 to 31
rem H$=STR$(32768*LD+1024*LE+32*LF+LG)+\" Remaining\"
rem text 50,50,H$
xa#=sin(LD*90/32.0)*cos(LE*90/32.0)
ya#=sin(LD*90/32.0)*sin(LE*90/32.0)
za#=cos(LD*90/32.0)
xb#=sin(LF*90/32.0)*cos(LG*90/32.0)
yb#=sin(LF*90/32.0)*sin(LG*90/32.0)
zb#=cos(LF*90/32.0)
xc#=(ya#*zb#)-(yb#*za#)
yc#=(za#*xb#)-(zb#*xa#)
zc#=(xa#*yb#)-(xb#*ya#)
if xc#<0
QA=-1
else
QA=1
endif
if yc#<0
QB=-1
else
QB=1
endif
if zc#<0
QC=-1
else
QC=1
endif
LC#=(xc#^2+yc#^2+zc#^2)^0.5
Theta#=ABS(ATAN(yc#/xc#))
CrossAns(LD,LE,LF,LG,0)=INT((Theta#/90.0)*32)
Theta#=ABS(ACOS(Abs(zc#/LC#)))
CrossAns(LD,LE,LF,LG,1)=INT((Theta#/90.0)*32)
CrossAns(LD,LE,LF,LG,2)=QA
CrossAns(LD,LE,LF,LG,3)=QB
CrossAns(LD,LE,LF,LG,4)=QC
CrossAns(LD,LE,LF,LG,20)=INT(((xa#*xb#)+(ya#*yb#)+(za#*zb#))*64)
xb#=-1*sin(LF*90/32.0)*cos(LG*90/32.0)
xc#=(ya#*zb#)-(yb#*za#)
yc#=(za#*xb#)-(zb#*xa#)
zc#=(xa#*yb#)-(xb#*ya#)
if xc#<0
QA=-1
else
QA=1
endif
if yc#<0
QB=-1
else
QB=1
endif
if zc#<0
QC=-1
else
QC=1
endif
LC#=(xc#^2+yc#^2+zc#^2)^0.5
Theta#=ABS(ATAN(yc#/xc#))
CrossAns(LD,LE,LF,LG,5)=INT((Theta#/90.0)*32)
Theta#=ABS(ACOS(Abs(zc#/LC#)))
CrossAns(LD,LE,LF,LG,6)=INT((Theta#/90.0)*32)
CrossAns(LD,LE,LF,LG,7)=QA
CrossAns(LD,LE,LF,LG,8)=QB
CrossAns(LD,LE,LF,LG,9)=QC
CrossAns(LD,LE,LF,LG,21)=INT(((xa#*xb#)+(ya#*yb#)+(za#*zb#))*64)
yb#=-1*sin(LF*90/32.0)*sin(LG*90/32.0)
xc#=(ya#*zb#)-(yb#*za#)
yc#=(za#*xb#)-(zb#*xa#)
zc#=(xa#*yb#)-(xb#*ya#)
if xc#<0
QA=-1
else
QA=1
endif
if yc#<0
QB=-1
else
QB=1
endif
if zc#<0
QC=-1
else
QC=1
endif
LC#=(xc#^2+yc#^2+zc#^2)^0.5
Theta#=ABS(ATAN(yc#/xc#))
CrossAns(LD,LE,LF,LG,10)=INT((Theta#/90.0)*32)
Theta#=ABS(ACOS(Abs(zc#/LC#)))
CrossAns(LD,LE,LF,LG,11)=INT((Theta#/90.0)*32)
CrossAns(LD,LE,LF,LG,12)=QA
CrossAns(LD,LE,LF,LG,13)=QB
CrossAns(LD,LE,LF,LG,14)=QC
CrossAns(LD,LE,LF,LG,22)=INT(((xa#*xb#)+(ya#*yb#)+(za#*zb#))*64)
zb#=-1*cos(LF*90/32.0)
xc#=(ya#*zb#)-(yb#*za#)
yc#=(za#*xb#)-(zb#*xa#)
zc#=(xa#*yb#)-(xb#*ya#)
if xc#<0
QA=-1
else
QA=1
endif
if yc#<0
QB=-1
else
QB=1
endif
if zc#<0
QC=-1
else
QC=1
endif
LC#=(xc#^2+yc#^2+zc#^2)^0.5
Theta#=ABS(ATAN(yc#/xc#))
CrossAns(LD,LE,LF,LG,15)=INT((Theta#/90.0)*32)
Theta#=ABS(ACOS(Abs(zc#/LC#)))
CrossAns(LD,LE,LF,LG,16)=INT((Theta#/90.0)*32)
CrossAns(LD,LE,LF,LG,17)=QA
CrossAns(LD,LE,LF,LG,18)=QB
CrossAns(LD,LE,LF,LG,19)=QC
CrossAns(LD,LE,LF,LG,23)=INT(((xa#*xb#)+(ya#*yb#)+(za#*zb#))*64)
Next LD
Next LE
Next LF
Next LG
For SDXC=0 to 31
For SDC=0 to 31
xc#=sin(SDXC*90/32.0)*cos(SDC*90/32.0)
yc#=sin(SDXC*90/32.0)*sin(SDC*90/32.0)
zc#=cos(SDXC*90/32.0)
Theta#=ABS(ATAN(zc#/xc#))
Phizx(SDXC,SDC)=INT((Theta#/90.0)*32)
Theta#=ABS(ATAN(xc#/yc#))
Phixy(SDXC,SDC)=INT((Theta#/90.0)*32)
Theta#=ABS(ATAN(zc#/yc#))
Phizy(SDXC,SDC)=INT((Theta#/90.0)*32)
Theta#=ABS(ATAN(yc#/zc#))
Phiyz(SDXC,SDC)=INT((Theta#/90.0)*32)
Theta#=ABS(ATAN(xc#/zc#))
Phixz(SDXC,SDC)=INT((Theta#/90.0)*32)
Theta#=ABS(ACOS(ABS(xc#)))
Thetax(SDXC,SDC)=INT((Theta#/90.0)*32)
Theta#=ABS(ACOS(ABS(yc#)))
Thetay(SDXC,SDC)=INT((Theta#/90.0)*32)
Next SDXC
Next SDC
rem left is normal map
ThetaGH=0
PhiGH=0
AGH=0
BGH=0
CGH=0
AGY=0
BGY=0
CGY=0
ThetaGY=0
PhiGY=0
NormalPhi=0
NormalTheta=0
NormA=0
NormB=0
NormC=0
CRED=0
CGREEN=0
CBLUE=0
FinalPhi=0
FinalTheta=0
FinalGreen=0
FinalRed=0
FinalBlue=0
LastCountGH=0
LastCountGY=0
if file exist(\"C:\\Program Files\\The Game Creators\\Dark Basic Pro Free\\Dark Basic Pro\\Projects\\NormalMap\\importantvalues.txt\") then delete file \"C:\\Program Files\\The Game Creators\\Dark Basic Pro Free\\Dark Basic Pro\\Projects\\NormalMap\\importantvalues.txt\"
OPEN TO WRITE 1, \"C:\\Program Files\\The Game Creators\\Dark Basic Pro Free\\Dark Basic Pro\\Projects\\NormalMap\\importantvalues.txt\"
for CountGH=1 to 100
for CountGY=1 to 100
R1#=Vectorpos(LastCountGH,LastCountGY,2)
Ang2=Vectorpos(LastCountGH,LastCountGY,0)
Ang1=Vectorpos(LastCountGH,LastCountGY,1)
QX=Vectorpos(LastCountGH,LastCountGY,3)
QY=Vectorpos(LastCountGH,LastCountGY,4)
QZ=Vectorpos(LastCountGH,LastCountGY,5)
R2#=Vectorpos(LastCountGH,CountGY,2)
Ang4=Vectorpos(LastCountGH,CountGY,0)
Ang3=Vectorpos(LastCountGH,CountGY,1)
QI=Vectorpos(LastCountGH,CountGY,3)
QJ=Vectorpos(LastCountGH,CountGY,4)
QK=Vectorpos(LastCountGH,CountGY,5)
if ShowThisOneX=CountGH
if ShowThisOneY=CountGY
hun$=\"Ang4:\"+Str$(Ang4)
Write String 1,hun$
hun$=\"Ang3:\"+Str$(Ang3)
Write String 1,hun$
hun$=\"R2#:\"+Str$(R2#)
Write String 1,hun$
hun$=\"Ang1:\"+Str$(Ang1)
Write String 1,hun$
hun$=\"Ang2:\"+Str$(Ang2)
Write String 1,hun$
hun$=\"R1#:\"+Str$(R1#)
Write String 1,hun$
endif
endif
FindRadiusA()
FindRadiusB()
SinRRatio()
PhiGH=SPhi()
ThetaGH=STheta()
if ShowThisOneX=CountGH
if ShowThisOneY=CountGY
hun$=\"PhiGH:\"+Str$(PhiGH)
Write String 1,hun$
hun$=\"ThetaGH:\"+Str$(ThetaGH)
Write String 1,hun$
endif
endif
AGH=QA
BGH=QB
CGH=QC
R2#=Vectorpos(CountGH,LastCountGY,2)
Ang4=Vectorpos(CountGH,LastCountGY,0)
Ang3=Vectorpos(CountGH,LastCountGY,1)
QI=Vectorpos(CountGH,LastCountGY,3)
QJ=Vectorpos(CountGH,LastCountGY,4)
QK=Vectorpos(CountGH,LastCountGY,5)
FindRadiusB()
SinRRatio()
PhiGY=SPhi()
ThetaGY=STheta()
AGY=QA
BGY=QB
CGY=QC
if ShowThisOneX=CountGH
if ShowThisOneY=CountGY
hun$=\"GYQuadX:\"+Str$(AGY)
Write String 1,hun$
hun$=\"GYQuadY:\"+Str$(BGY)
Write String 1,hun$
hun$=\"GYQuadZ:\"+Str$(CGY)
Write String 1,hun$
endif
endif
Ang4=PhiGY
Ang3=ThetaGY
Ang2=PhiGH
Ang1=ThetaGH
if ShowThisOneX=CountGH
if ShowThisOneY=CountGY
hun$=\"PhiGY:\"+Str$(PhiGY)
Write String 1,hun$
hun$=\"ThetaGY:\"+Str$(ThetaGY)
Write String 1,hun$
endif
endif
QI=QA
QJ=QB
QK=QC
QX=AGH
QY=BGH
QZ=CGH
if ShowThisOneX=CountGH
if ShowThisOneY=CountGY
hun$=\"GHQuadX:\"+Str$(AGH)
Write String 1,hun$
hun$=\"GHQuadY:\"+Str$(BGH)
Write String 1,hun$
hun$=\"GHQuadZ:\"+Str$(CGH)
Write String 1,hun$
endif
endif
Getcrossproduct()
NormalPhi=CrossPhi
NormalTheta=CrossTheta
if ShowThisOneX=CountGH
if ShowThisOneY=CountGY
hun$=\"PhiN:\"+Str$(NormalPhi)
Write String 1,hun$
hun$=\"ThetaN:\"+Str$(NormalTheta)
Write String 1,hun$
endif
endif
NormA=QA
NormB=QB
NormC=QC
if ShowThisOneX=CountGH
if ShowThisOneY=CountGY
hun$=\"NormX:\"+Str$(NormA)
Write String 1,hun$
hun$=\"NormY:\"+Str$(NormB)
Write String 1,hun$
hun$=\"NormZ:\"+Str$(NormC)
Write String 1,hun$
endif
endif
Ang1=CrossTheta
Ang2=CrossPhi
Ang3=ThetaGH
Ang4=PhiGH
QX=NormA
QY=NormB
QZ=NormC
QI=AGH
QJ=BGH
QK=CGH
Getcrossproduct()
R1#=(ImageRed(CountGH,CountGY)-128)
R2#=(ImageGreen(CountGH,CountGY)-128)
if ShowThisOneX=CountGH
if ShowThisOneY=CountGY
hun$=\"R1#:\"+Str$(R1#)
Write String 1,hun$
hun$=\"R2#:\"+Str$(R2#)
Write String 1,hun$
endif
endif
REM Found Binormal
Ang1=CrossTheta
Ang2=CrossPhi
Ang3=ThetaGH
Ang4=PhiGH
QX=QA
QY=QB
QZ=QC
QI=AGH
QJ=BGH
QK=CGH
FindRadiusB()
SinRRatio()
FinalPhi=SPhi()
FinalTheta=STheta()
if ShowThisOneX=CountGH
if ShowThisOneY=CountGY
hun$=\"FinalPhi:\"+Str$(FinalPhi)
Write String 1,hun$
hun$=\"FinalThet:\"+Str$(FinalTheta)
Write String 1,hun$
endif
endif
QX=QA
QY=QB
QZ=QC
Ang3=Vectorpos(LastCountGH,LastCountGY,0)
Ang4=Vectorpos(LastCountGH,LastCountGY,1)
QI=Vectorpos(LastCountGH,LastCountGY,3)
QJ=Vectorpos(LastCountGH,LastCountGY,4)
QK=Vectorpos(LastCountGH,LastCountGY,5)
Ang1=FinalTheta
Ang2=FinalPhi
Ang3=Vectorpos(LastCountGH,LastCountGY,0)
Ang4=Vectorpos(LastCountGH,LastCountGY,1)
finddotproduct()
ImageRed(CountGH,CountGY)=LNQ
Ang1=NormalTheta
Ang2=NormalPhi
Ang3=Vectorpos(LastCountGH,LastCountGY,0)
Ang4=Vectorpos(LastCountGH,LastCountGY,1)
QX=NormA
QY=NormB
QZ=NormC
QI=Vectorpos(LastCountGH,LastCountGY,3)
QJ=Vectorpos(LastCountGH,LastCountGY,4)
QK=Vectorpos(LastCountGH,LastCountGY,5)
if ShowThisOneX=CountGH
if ShowThisOneY=CountGY
hun$=\"One:\"+Str$(LNQ)
Write String 1,hun$
endif
endif
finddotproduct()
ImageGreen(CountGH,CountGY)=LNQ
if ShowThisOneX=CountGH
if ShowThisOneY=CountGY
hun$=\"Two:\"+Str$(LNQ)
Write String 1,hun$
endif
endif
LastCountGH=CountGH
LastCountGY=CountGY
next CountGY
next CountGH
cls
load bitmap \"C:\\Documents and Settings\\Owner\\My Documents\\My Pictures\\Vash Image.bmp\"
For CounGH= 0 to 100
For CounGY= 0 to 100
CRED=RGBR(Point(CounGH,CounGY))
CGREEN=RGBG(Point(CounGH,CounGY))
CBLUE=RGBB(Point(CounGH,CounGY))
if ImageGreen(CounGH,CounGY)>0 or ImageGreen(CounGH,CounGY)<0
CGREEN=ImageRed(CounGH,CounGY)*CGREEN/ImageGreen(CounGH,CounGY)
CBLUE=ImageRed(CounGH,CounGY)*CBLUE/ImageGreen(CounGH,CounGY)
CRED=ImageRed(CounGH,CounGY)*CRED/ImageGreen(CounGH,CounGY)
else
CGREEN=255
CRED=255
CBLUE=255
endif
if CGREEN>255
CGREEN=255
endif
if CGREEN<0
CGREEN=0
endif
if CRED>255
CRED=255
endif
if CRED<0
CRED=0
endif
if CBLUE>255
CBLUE=255
endif
if CBLUE<0
CBLUE=0
endif
Dot 540+CounGH,CounGY,RGB(CRED,CGREEN,CBLUE)
Next CounGY
Next CounGH
wait key
wait key
END
function Getcrossproduct()
rem still need to check quadrants
Theta=0
Phi=0
Hold1=Ang1
Hold2=Ang2
Hold3=Ang3
Hold4=Ang4
if (QX=QI)
if (QY=QJ)
if (QZ=QK)
rem swap quadrants and values
LNQ=CrossAns(Ang1,Ang2,Ang3,Ang4,20)
Theta=CrossAns(Ang1,Ang2,Ang3,Ang4,1)
Phi=CrossAns(Ang1,Ang2,Ang3,Ang4,0)
QA=CrossAns(Ang1,Ang2,Ang3,Ang4,2)
QB=CrossAns(Ang1,Ang2,Ang3,Ang4,3)
QC=CrossAns(Ang1,Ang2,Ang3,Ang4,4)
else
Ang2=Phixz(Hold1,Hold2)
Ang1=Thetay(Hold1,Hold2)
Ang4=Phixz(Hold3,Hold4)
Ang3=Thetay(Hold3,Hold4)
LNQ=CrossAns(Ang1,Ang2,Ang3,Ang4,21)
Theta=CrossAns(Ang1,Ang2,Ang3,Ang4,6)
Phi=CrossAns(Ang1,Ang2,Ang3,Ang4,5)
QA=CrossAns(Ang1,Ang2,Ang3,Ang4,7)
QB=CrossAns(Ang1,Ang2,Ang3,Ang4,8)
QC=CrossAns(Ang1,Ang2,Ang3,Ang4,9)
endif
else
if (QZ=QK)
Ang2=Phizy(Hold1,Hold2)
Ang1=Thetax(Hold1,Hold2)
Ang4=Phizy(Hold3,Hold4)
Ang3=Thetax(Hold3,Hold4)
LNQ=CrossAns(Ang1,Ang2,Ang3,Ang4,21)
Theta=CrossAns(Ang1,Ang2,Ang3,Ang4,6)
Phi=CrossAns(Ang1,Ang2,Ang3,Ang4,5)
QA=CrossAns(Ang1,Ang2,Ang3,Ang4,7)
QB=CrossAns(Ang1,Ang2,Ang3,Ang4,8)
QC=CrossAns(Ang1,Ang2,Ang3,Ang4,9)
else
Ang2=Phizy(Hold1,Hold2)
Ang1=Thetax(Hold1,Hold2)
Ang4=Phizy(Hold3,Hold4)
Ang3=Thetax(Hold3,Hold4)
LNQ=CrossAns(Ang1,Ang2,Ang3,Ang4,22)
Theta=CrossAns(Ang1,Ang2,Ang3,Ang4,11)
Phi=CrossAns(Ang1,Ang2,Ang3,Ang4,10)
QA=CrossAns(Ang1,Ang2,Ang3,Ang4,12)
QB=CrossAns(Ang1,Ang2,Ang3,Ang4,13)
QC=CrossAns(Ang1,Ang2,Ang3,Ang4,14)
endif
endif
else
if (QY=QJ)
if (QZ=QK)
LNQ=CrossAns(Ang1,Ang2,Ang3,Ang4,21)
Theta=CrossAns(Ang1,Ang2,Ang3,Ang4,6)
Phi=CrossAns(Ang1,Ang2,Ang3,Ang4,5)
QA=CrossAns(Ang1,Ang2,Ang3,Ang4,7)
QB=CrossAns(Ang1,Ang2,Ang3,Ang4,8)
QC=CrossAns(Ang1,Ang2,Ang3,Ang4,9)
else
Ang2=Phixz(Hold1,Hold2)
Ang1=Thetay(Hold1,Hold2)
Ang4=Phixz(Hold3,Hold4)
Ang3=Thetay(Hold3,Hold4)
LNQ=CrossAns(Ang1,Ang2,Ang3,Ang4,22)
Theta=CrossAns(Ang1,Ang2,Ang3,Ang4,11)
Phi=CrossAns(Ang1,Ang2,Ang3,Ang4,10)
QA=CrossAns(Ang1,Ang2,Ang3,Ang4,12)
QB=CrossAns(Ang1,Ang2,Ang3,Ang4,13)
QC=CrossAns(Ang1,Ang2,Ang3,Ang4,14)
endif
else
if (QZ=QK)
LNQ=CrossAns(Ang1,Ang2,Ang3,Ang4,22)
Theta=CrossAns(Ang1,Ang2,Ang3,Ang4,11)
Phi=CrossAns(Ang1,Ang2,Ang3,Ang4,10)
QA=CrossAns(Ang1,Ang2,Ang3,Ang4,12)
QB=CrossAns(Ang1,Ang2,Ang3,Ang4,13)
QC=CrossAns(Ang1,Ang2,Ang3,Ang4,14)
else
LNQ=CrossAns(Ang1,Ang2,Ang3,Ang4,23)
Theta=CrossAns(Ang1,Ang2,Ang3,Ang4,16)
Phi=CrossAns(Ang1,Ang2,Ang3,Ang4,15)
QA=CrossAns(Ang1,Ang2,Ang3,Ang4,17)
QB=CrossAns(Ang1,Ang2,Ang3,Ang4,18)
QC=CrossAns(Ang1,Ang2,Ang3,Ang4,19)
endif
endif
endif
Ang1=Hold1
Ang2=Hold2
Ang3=Hold3
Ang4=Hold4
rem Type=2
rem QX=1
rem QZ=1
rem QY=change
rem Ans=Quadrant -x,y changes based on {x,y},z
rem QX=change
CrossPhi=Phi
CrossTheta=Theta
if CrossPhi<1
CrossPhi=0
endif
if CrossTheta<1
CrossTheta=0
endif
if CrossPhi>31
CrossPhi=0
endif
if CrossTheta>31
CrossTheta=0
endif
endfunction
function SinRRatio()
RSratio#=R2#*Sin(90.0*Ang3/32)/R1#
endFunction
Function SPhi()
rem in the future call x and y when the object is read to the cache.
rem put into an array in x and y later where x and y keep sign
IF QX*sin(bitang(Ang1))*cos(bitang(ang2))>QI*sin(bitang(Ang3))*cos(bitang(ang4))
QA=1
else
QA=-1
endif
IF QY*sin(bitang(Ang1))*sin(bitang(ang2))>QJ*sin(bitang(Ang3))*sin(bitang(ang4))
QB=1
else
QB=-1
endif
ANS=INT(ATAN(((RSratio#/Sin(bitang(Ang1)))*sin(90.0*Ang4/32)-sin(90.0*Ang2/32))/((RSratio#/sin(bitang(Ang1))*cos(90.0*Ang4/32)-cos(90.0*Ang2/32))))/90*32)
if ANS>0 and ANS<130
ANS=ANS%%32
else
ANS=0
endif
endfunction ANS
Function SUnitPhi()
rem put into an array in x and y later where x and y keep sign
IF QX*sin(bitang(Ang1))*cos(bitang(ang2))>QI*sin(bitang(Ang3))*cos(bitang(ang4))
QA=1
else
QA=-1
endif
IF QY*sin(bitang(Ang1))*sin(bitang(ang2))>QJ*sin(bitang(Ang3))*sin(bitang(ang4))
QB=1
else
QB=-1
endif
ANS=INT(ATAN(((sin(90.0*Ang1/32)*(sin(90.0*Ang2/32))-(sin(90.0*Ang3/32)*sin(90.0*Ang4/32))))/((sin(Ang1/32*90.0)*(cos(90.0*Ang2/32))-(cos(90.0*Ang4/32)*sin(90.0*Ang3/32)))))/90.0*32)
if ANS>0 and ANS<130
ANS=ANS%%32
else
ANS=0
endif
endfunction ANS
Function SUnitTheta()
if CrossAns(Ang1,Ang2,0,0,20)>CrossAns(Ang3,Ang4,0,0,20)
QC=-1
else
QC=1
endif
ANS=INT(32/90.0*ACOS(ABS(cos(bitang(Ang2))-cos(bitang(Ang4))/(2-2*(sin(bitang(Ang1))*cos(bitang(Ang2))*sin(bitang(Ang3))*cos(bitang(Ang4))+sin(bitang(Ang1))*sin(bitang(Ang2))*sin(bitang(Ang3))*sin(bitang(Ang4))+cos(bitang(Ang1))*cos(bitang(Ang3)))))))
if ANS>0 and ANS<130
ANS=ANS%%32
else
ANS=0
endif
endfunction ANS
rem hh
Function STheta()
finddotproduct()
Zdiff#=(RSratio#/SQRT(ABS(SIN(bitang(Ang3))))*COS(bitang(Ang2)*QK))-(SQRT(ABS(SIN(bitang(Ang3)))))*QZ*COS(bitang(Ang4))
rem RSratio should equal R2#Sin3/R1#
if ZDiff<0
QC=-1
else
QC=1
endif
ANS=INT(32/90.0*ACOS(ABS(Zdiff#)/sqrt(ABS((sin(bitang(Ang3))+((RSratio#*RSratio#)/Sin(bitang(Ang3)))-(2*RSratio#*(LNQ*64)))))))
if ANS>0 and ANS<130
ANS=ANS%%32
else
ANS=0
endif
endfunction ANS
function ln(x#)
rem calculate Hn
Hold#=0
for n#=1.00 to x#
Harm#=1.00/n#
Hold#=Harm#+Hold#
next n#
rem approximate Hn-ln n
Gamma#=.5772156
AppError#=1/(2*x#)
Gamman#=Gamma#+AppError#
rem Subtract Hn-gamma
Lnx#=Hold#-Gamman#
endfunction Lnx#
function FindRadiusA()
R1#=INT(exp(0.104360*R1#))
endfunction
function FindRadiusB()
R2#=INT(exp(0.104360*R2#))
endfunction
function bitang(a)
Ans#=90.0*a/32
endfunction Ans#
function finddotproduct()
rem for final include swap in object
Ang1=INT(Ang1)
Ang2=INT(Ang2)
Ang3=INT(Ang3)
Ang4=INT(Ang4)
Hold1=Ang1
Hold2=Ang2
Hold3=Ang3
Hold4=Ang4
If Ang1<32 and Ang1>-1
else
Ang1=0
endif
If Ang2<32 and Ang2>-1
else
Ang2=0
endif
If Ang3<32 and Ang3>-1
else
Ang3=0
endif
If Ang4<32 and Ang4>-1
else
Ang4=0
endif
if (QX=QI)
if (QY=QJ)
if (QZ=QK)
rem swap quadrants and values
LNQ=CrossAns(Hold1,Hold2,Hold3,Hold4,20)
else
Hold2=Phixz(Ang1,Ang2)
Hold1=Thetay(Ang1,Ang2)
Hold4=Phixz(Ang3,Ang4)
Hold3=Thetay(Ang3,Ang4)
LNQ=CrossAns(Hold1,Hold2,Hold3,Hold4,21)
endif
else
if (QZ=QK)
Hold2=Phizy(Ang1,Ang2)
Hold1=Thetax(Ang1,Ang2)
Hold4=Phizy(Ang3,Ang4)
Hold3=Thetax(Ang3,Ang4)
LNQ=CrossAns(Hold1,Hold2,Hold3,Hold4,21)
else
Hold2=Phizy(Ang1,Ang2)
Hold1=Thetax(Ang1,Ang2)
Hold4=Phizy(Ang3,Ang4)
Hold3=Thetax(Ang3,Ang4)
LNQ=CrossAns(Hold1,Hold2,Hold3,Hold4,22)
endif
endif
else
if (QY=QJ)
if (QZ=QK)
LNQ=CrossAns(Hold1,Hold2,Hold3,Hold4,21)
else
Hold2=Phixz(Ang1,Ang2)
Hold1=Thetay(Ang1,Ang2)
Hold4=Phixz(Ang3,Ang4)
Hold3=Thetay(Ang3,Ang4)
LNQ=CrossAns(Hold1,Hold2,Hold3,Hold4,22)
endif
else
if (QZ=QK)
LNQ=CrossAns(Hold1,Hold2,Hold3,Hold4,22)
else
LNQ=CrossAns(Hold1,Hold2,Hold3,Hold4,23)
endif
endif
endif
endfunction
XXX