protected override void DoSomething() { delta.Set(target).Sub(obj.Position); direction.Add(delta).Div(4); delta.Set(direction).Div(direction.Length()).Mul(speed); delta.z = (target.z - obj.Position.z - 20) / 20; modifier.MoveObject(obj, delta); Thread.Sleep(1); }
public void fire_LightSphere(int radius, int range, int level) { int diameter = range * 2; XYZ_d rs_origin = new XYZ_d(rayStrike); XYZ_d rs = new XYZ_d(rs_origin); Task.Factory.StartNew(() => { for (int i = 0; i < diameter; i++) { for (int j = 0; j < diameter; j++) { for (int k = 0; k < diameter; k++) { rs.Set(rs_origin); rs.Add(i - range, j - range, k - range); if (!world.isIn(rs)) { continue; } double distance = Math.Sqrt(Math.Pow(i - range, 2) + Math.Pow(j - range, 2) + Math.Pow(k - range, 2)); if (distance <= radius && distance > radius - 2) { world.SetLevel(rs, 10); } else if (distance > radius && distance < range) { world.AddLevel(rs, (int)(level * (range - distance) / range)); } } } Thread.Sleep(1); } }); }
void Spin_matrix_z(double x, double y, double z, double d, XYZ_d position) { position.Set(x, y, z); if (d != 0) { func(x, y, ref position.x, ref position.y, d); } }
public void SpinObject(Object o, XYZ_d degree, Matrix matrix) { XYZ_d next = new XYZ_d(); XYZ_d delta = new XYZ_d(0, 0, o.size.z - 1); XYZ_d axis = new XYZ_d(o.axis); Pixel p = null; matrix(axis, degree); matrix(delta, degree); delta.Div(o.size.z); for (int i = 0; i < o.size.x; i++) { for (int j = 0; j < o.size.y; j++) { p = null; int temp = -1; while (p == null && temp < o.size.z) { temp++; p = o.GetPixel(i, j, temp); } if (p == null) { continue; } next.Set(i, j, 0); matrix(next, degree); for (int k = temp; k < o.size.z; k++) { p = o.GetPixel(i, j, k); if (p == null) { continue; } if (world.GetPixel(p.Position) == p) { world.ReSetPixel(p); } p.Position.Set(delta).Mul(k + 1).Add(next).Sub(axis).Add(o.Position); world.SetPixel(p); } } } DrawObject(o); }
public World(XYZ worldSize) { image = new Bitmap(Application.StartupPath + @"\MapImage\example.jpg"); this.worldSize = worldSize; frameSize.Set(worldSize); realSize.Set(worldSize).Mul(frameLength); //Map = new byte[frameSize.x,frameSize.y,frameSize.z]; Map = new Block[frameSize.x, frameSize.y, frameSize.z]; for (int i = 0; i < frameSize.x; i++) { for (int j = 0; j < frameSize.y; j++) { for (int k = 0; k < frameSize.z; k++) { Map[i, j, k] = new Block(false, new XYZ_b(), renderer_air); } } } DrawMap(image); image = new Bitmap(Application.StartupPath + @"\MapImage\CloudShape.png"); DrawCloud(image, frameSize.z / 3); image = new Bitmap(Application.StartupPath + @"\MapImage\Building.png"); DrawBuilding(image, new XYZ(280, 280, 100)); //Random rand = new Random(); //for (int i = 0; i < frameSize.x; i++) // for (int j = 0; j < frameSize.y; j++) // for (int k = frameSize.z / 2; k < frameSize.z; k++) // { // //Map[i,j,k] = (byte)((i * j * k / 11) % 6 + 1); // //Map[i,j,k].color.Set // // ((byte)128, // // (byte)128,(byte)rand.Next(100, 255)); // // Map[i, j, k].color.Set((byte)(Math.Sin(i) * 200 + 100), (byte)(Math.Sin(j) *200 + 100), (byte)(Math.Sin(k) * 200 + 100)); // // Map[i, j, k].color.Add((byte)(Math.Cos(i) * 200 + 100), (byte)(Math.Cos(j) *200 + 100), (byte)(Math.Cos(k) * 200 + 100)); // //Map[i,j,k].color.Set((byte)((i * j * k) % 256), (byte)((i * j * k) % 256), 255); // Map[i, j, k].code = 1; // //Map[i, j, k].color.Set((byte)rand.Next(100, 255)); // Map[i, j, k].color.Set(0); // } }
public void Falling() { Vector.z += 4; if (!Check_Wall(Vector)) { Position.Add(Vector); world.ConvertToInfinity(Position); } else if (Vector.Length() != 0) { XYZ index = new XYZ(); world.GetFrameIndex(new XYZ_d(Position).Add(Vector), index); double vLength = Vector.Length(); if (vLength > 90) { // if(world.IsInFrame(index)) // CrushFrame((int)(vLength / 4)); Vector.Div(4); return; } else { isJumpable = true; } world.ConvertIndexToPosition(index); if (Vector.z > 0) { Position.z = index.z - world.frameLength / 2 - 1; } else { Position.z = index.z + world.frameLength / 2 + 4; isJumpable = false; } Vector.Set(0); } }
public void Spin_XZAxis5() { position.Set(Position); cursor.x += (Cursor.Position.X - screenPoint.X) * sensitivity; cursor.y += (Cursor.Position.Y - screenPoint.Y) * sensitivity; cursor.x %= 360; cursor.y %= 360; cursor.y = cursor.y > 90 ? 90 : (cursor.y < -90 ? -90 : cursor.y); Cursor.Position = screenPoint; double degreeX = cursor.y * -PI; double degreeY = cursor.x * PI; double sinX = Math.Sin(degreeX); double sinY = Math.Sin(degreeY); double cosX = Math.Cos(degreeX); double cosY = Math.Cos(degreeY); bool isTargetSet = false; basisX.Set(1, 0, 0); basisY.Set(0, camSize.y - 1, 0); basisZ.Set(0, 0, 1); Spin_matrix_x(basisX.x, basisX.y, basisX.z, sinX, cosX, basisX); Spin_matrix_z(basisX.x, basisX.y, basisX.z, sinY, cosY, basisX); Spin_matrix_x(basisY.x, basisY.y, basisY.z, sinX, cosX, basisY); Spin_matrix_z(basisY.x, basisY.y, basisY.z, sinY, cosY, basisY); Spin_matrix_x(basisZ.x, basisZ.y, basisZ.z, sinX, cosX, basisZ); Spin_matrix_z(basisZ.x, basisZ.y, basisZ.z, sinY, cosY, basisZ); world.GetFrameIndex(position, PositionIndex); Parallel.For(0, camSize.z, (int k) => { Parallel.For(0, camSize.x, (int i) => { int depth = 0; board[k, i] = ' '; perspBasisX[i, k].Set(basisX).Mul(perspArray[i, k].x); perspBasisZ[i, k].Set(basisZ).Mul(perspArray[i, k].z); spinArray[i, k].Set(perspBasisX[i, k]).Add(basisY).Add(perspBasisZ[i, k]); XYZ_d delta = deltaArray[i, k].Set(spinArray[i, k]).Div(camSize.y); XYZ_d index = indexArray[i, k].Set(position); XYZ_d gap = new XYZ_d(); XYZ_d lpos = new XYZ_d(); XYZ frameIndex = new XYZ(); XYZ nextFrameIndexDelta = new XYZ(); XYZ_d target = new XYZ_d(); XYZ_d deltaSign = new XYZ_d(); if (delta.x != 0) { deltaSign.x = (Math.Abs(delta.x) / delta.x); } if (delta.y != 0) { deltaSign.y = (Math.Abs(delta.y) / delta.y); } if (delta.z != 0) { deltaSign.z = (Math.Abs(delta.z) / delta.z); } frameIndex.Set(PositionIndex); double numOfDelta = 0; for (int j = 0; j < camSize.y; j++) { if (!world.IsInFrame(frameIndex) || j == camSize.y - 1) { depth = depth < 0 ? 0 : depth > 9 ? 9 : depth; board[k, i] = level[depth]; break; } world.ConvertToFramePos(lpos.Set(index), frameIndex); if (world.IsExistPixelInFrame(frameIndex)) { if (i == camPoint.x && k == camPoint.z && !isTargetSet) { deleteFrameIndex.Set(frameIndex); addFrameIndex.Set(frameIndex).Sub(nextFrameIndexDelta); isTargetSet = true; } if (frameIndex.Equal(deleteFrameIndex)) { depth += 3; //쳐다보는 블록 색깔 } world.GetFrameIndex(index, gap); if (gridEnabled && gap.Distance(PositionIndex) < 3) //3칸블록 이내 범위있을 경우 경계선표시. { bool Xaxis = Math.Abs(lpos.x) > world.frameLength / 2 - 1; //경계선 테두리 크기 1 bool Yaxis = Math.Abs(lpos.y) > world.frameLength / 2 - 1; bool Zaxis = Math.Abs(lpos.z) > world.frameLength / 2 - 1; int inv_color = world.GetColor(frameIndex); if (inv_color > 5) { if (inv_color == 14) { inv_color = 9; } else { inv_color = 0; } } else { inv_color = 9; } inv_color += (5 - inv_color) / 5 * 2; if (Xaxis && Yaxis) { board[k, i] = level[inv_color]; break; } if (Yaxis && Zaxis) { board[k, i] = level[inv_color]; break; } if (Zaxis && Xaxis) { board[k, i] = level[inv_color]; break; } } if (world.GetColor(frameIndex) == 14) // 거울만나면 반사. { if (nextFrameIndexDelta.x != 0) { delta.x = -delta.x; deltaSign.x = -deltaSign.x; } else if (nextFrameIndexDelta.y != 0) { delta.y = -delta.y; deltaSign.y = -deltaSign.y; } else if (nextFrameIndexDelta.z != 0) { delta.z = -delta.z; deltaSign.z = -deltaSign.z; } frameIndex.Sub(nextFrameIndexDelta); // 일보후퇴 continue; } else if (world.GetColor(frameIndex) == 15) // 유리만나면 살짝 하얘지고 계속 진행. { depth = depth > 3 ? 3 : depth + 1; } else { depth += (int)(world.GetColor(frameIndex)); depth = depth < 0 ? 0 : depth > 9 ? 9 : depth; board[k, i] = level[depth]; break; } } //현위치에서 delta벡터방향으로 이동할 경우 가장 먼저 만나는 경계면 구하기. target.Set(world.frameLength / 2); target.Mul(deltaSign); //delta벡터 방향으로 이동시 접촉가능한 경계면들 구하기. target.Sub(lpos).Div(delta); //경계면들로부터 현재위치의 거리를 구하고 delta로 나누기. deltasign으로 한번 곱했었기때문에 x,y,z축 서로에 대한 정확한 비교값이 나오게된다. nextFrameIndexDelta.Set(0); if (target.x < target.y && target.x < target.z) { numOfDelta = target.x; nextFrameIndexDelta.x = (int)deltaSign.x; } else if (target.y < target.x && target.y < target.z) { numOfDelta = target.y; nextFrameIndexDelta.y = (int)deltaSign.y; } else if (target.z < target.x && target.z < target.y) { numOfDelta = target.z; nextFrameIndexDelta.z = (int)deltaSign.z; } frameIndex.Add(nextFrameIndexDelta); //가장가까운 경계면에 해당하는 블록으로 이동. index.Add(gap.Set(delta).Mul(numOfDelta)); //delta방향으로 가장 가까운 경계면으로 이동. //여기까지 수정 } }); }); rayDelta.Set(deltaArray[camPoint.x, camPoint.z]); }
void Shoot(XYZ_b color, XYZ_d rayDelta) { XYZ_d delta = new XYZ_d(rayDelta); XYZ_d lpos = new XYZ_d(delta).Mul(world.frameLength * 2).Add(Position); XYZ frameIndex = new XYZ(); world.GetFrameIndex(lpos, frameIndex); world.ConvertToFramePos(frameIndex, lpos); XYZ frameIndex2 = new XYZ(frameIndex); int nextDir = 0; XYZ_d target = new XYZ_d(); XYZ_d deltaSign = new XYZ_d(); XYZ_d maxNumOfDelta = new XYZ_d(world.frameLength); if (delta.x != 0) { deltaSign.x = (Math.Abs(delta.x) / delta.x); } if (delta.y != 0) { deltaSign.y = (Math.Abs(delta.y) / delta.y); } if (delta.z != 0) { deltaSign.z = (Math.Abs(delta.z) / delta.z); } maxNumOfDelta.Mul(deltaSign).Div(delta); target.Set(world.halfFrameLength).Mul(deltaSign); //delta벡터 방향으로 이동시 접촉가능한 경계면들 구하기. target.Sub(lpos).Div(delta); //경계면들로부터 현재위치의 거리를 구하고 delta로 나누기. deltasign으로 한번 곱했었기때문에 x,y,z축 서로에 대한 정확한 비교값이 나오게된다. Task.Factory.StartNew(() => { while (!world.isFrameEnabled(frameIndex)) { world.ConvertToInfinity(frameIndex); world.SetFrame(frameIndex2, false); world.SetFrame(frameIndex, true); world.SetColor(frameIndex, color); if (target.x < target.y) { if (target.x < target.z) { nextDir = 0; } else { nextDir = 2; } } else if (target.y < target.z) { nextDir = 1; } else { nextDir = 2; } target.element[nextDir] += maxNumOfDelta.element[nextDir]; frameIndex2.Set(frameIndex); frameIndex.element[nextDir] += (int)deltaSign.element[nextDir]; Thread.Sleep(10); } world.SetFrame(frameIndex2, false); XYZ temp = new XYZ(); int scale = 10; double distance = 0; for (int i = -scale; i < scale; i++) { for (int j = -scale; j < scale; j++) { for (int k = -scale; k < scale; k++) { temp.Set(frameIndex).Add(i, j, k); distance = frameIndex.Distance(temp); if (distance < scale) { world.ConvertToInfinity(temp); XYZ_b c = world.GetColor(temp); //gap.x = (int)color.x - (int)c.x; //gap.y = (int)color.y - (int)c.y; //gap.z = (int)color.z - (int)c.z; //gap.Mul((int)(scale - distance)).Div(scale); //c.x = (byte)(c.x + gap.x); //c.y = (byte)(c.y + gap.y); //c.z = (byte)(c.z + gap.z); temp.x = (int)color.x * (int)(scale - distance) / scale; temp.y = (int)color.y * (int)(scale - distance) / scale; temp.z = (int)color.z * (int)(scale - distance) / scale; c.Add((byte)temp.x, (byte)temp.y, (byte)temp.z); // world.SetFrame(temp, false); //world.SetColor(temp, 255, 0, 0); } } } } }); }
public void Spin_XZAxis4() { isRendering = true; position.Set(Position); if (isLighting && isLightMove) { lightAngle.x += (Cursor.Position.X - screenPoint.X) * sensitivity; lightAngle.y += (Cursor.Position.Y - screenPoint.Y) * sensitivity; Spin_Light2(); } else { cursor.x += (Cursor.Position.X - screenPoint.X) * sensitivity; cursor.y += (Cursor.Position.Y - screenPoint.Y) * sensitivity; cursor.x %= 360; cursor.y %= 360; cursor.y = cursor.y > 90 ? 90 : (cursor.y < -90 ? -90 : cursor.y); } Cursor.Position = screenPoint; double degreeX = cursor.y * -PI; double degreeY = cursor.x * PI; double sinX = Math.Sin(degreeX); double sinY = Math.Sin(degreeY); double cosX = Math.Cos(degreeX); double cosY = Math.Cos(degreeY); for (int k = 0; k < camSize.z; k++) { Parallel.For(0, camSize.x, (int i) => //for (int i = 0; i < camSize.x; i++) { int depth = 0; Pixel pixel; board[k, i] = ' '; color[k, i].Set(0, 0, 0); // = ConsoleColor.Black; Spin_matrix_x(perspArray[i, k].x, perspArray[i, k].y, perspArray[i, k].z, sinX, cosX, spinArray[i, k]); Spin_matrix_z(spinArray[i, k].x, spinArray[i, k].y, spinArray[i, k].z, sinY, cosY, spinArray[i, k]); int length = camSize.y; XYZ_d delta = deltaArray[i, k].Set(spinArray[i, k]).Div(length * 2); XYZ_d index = indexArray[i, k].Set(position); for (int j = 0; j < length * 2; j++) { index.Add(delta); pixel = world.GetPixel(index); if (pixel != null) { if (pixel.Position == null) { break; } if (!pixel.isVisible) { continue; } if (isLighting) { /* depth = (int)(13 * (70 - position.Distance(pixel.Position)) / (70d)); * depth = depth < 0 ? 0 : * depth > 9 ? 9 : depth; */ depth += (int)lightArray[i, j / 2, k]; } depth += world.GetLevel(index) + pixel.level; depth = depth < 0 ? 0 : depth > 9 ? 9 : depth; board[k, i] = level[depth]; // viewer.Draw(i,k,depth); color[k, i].Set(pixel.color); color[k, i].Add((byte)(12 * (depth))); /* Console.Write(rayStrike.x); * Console.Write(","); * Console.Write(rayStrike.y); * Console.Write(","); * Console.Write(rayStrike.z); * Console.WriteLine(); */ break; } } }); } //); isRendering = false; rayDelta.Set(spinArray[camPoint.x - 1, camPoint.z - 1]).Div(camSize.y); rayStrike.Set(indexArray[camPoint.x - 1, camPoint.z - 1]); }
/*public void Print() * { * Console.SetCursorPosition(0,0); * string a = ""; * Make_CrossHead(); * * ConsoleColor current = ConsoleColor.White; * * for(int i = 0; i < camSize.z; i++) * { * for(int j = 0; j < camSize.x; j++) * { * if(current!=color[i,j]) * { * result.Add(new Ps(a,current)); * a = ""; * current = color[i,j]; * } * a += board[i,j]; * } * a += "\r\n"; * } * result.Add(new Ps(a,current)); * foreach(Ps p in result) * { * p.Print(); * } * result.Clear(); * * }*/ public void Spin_Light2() { double degreeX = -lightAngle.y * PI; double degreeY = lightAngle.x * PI; double sinX = Math.Sin(degreeX); double sinY = Math.Sin(degreeY); double cosX = Math.Cos(degreeX); double cosY = Math.Cos(degreeY); int x = 0; int y = 0; int z = 0; XYZ_d startPos = new XYZ_d(); XYZ_d endPos = new XYZ_d(); XYZ_d index = new XYZ_d(); for (int i = 0; i < camSize.x; i++) { for (int j = 0; j < camSize.y; j++) { for (int k = 0; k < camSize.z; k++) { lightArray[i, j, k] = 0; } } } int radius = camPoint.x / 2; for (int k = 0; k < camPoint.x; k++) { for (int i = 0; i < camPoint.x; i++) { if (circle[i, k]) { double length = 200; Spin_matrix_x(i - radius, 0, k - radius, sinX, cosX, startPos); Spin_matrix_z(startPos.x, startPos.y, startPos.z, sinY, cosY, startPos); Spin_matrix_x(i - radius, length, k - radius, sinX, cosX, endPos); Spin_matrix_z(endPos.x, endPos.y, endPos.z, sinY, cosY, endPos); endPos.Sub(startPos).Div(length); index.Set(startPos); index.x += camPoint.x; index.z += camPoint.z; for (int j = 0; j < length; j++) { index.Add(endPos); x = index.iX; y = index.iY; z = index.iZ; if (x >= 0 && x < camSize.x && y >= 0 && y < camSize.y && z >= 0 && z < camSize.z) { double distance = Math.Sqrt(Math.Pow(i - radius, 2) + Math.Pow(k - radius, 2)); double power = 14 * (camSize.y - j) / (camSize.y * 1f); if (power < 1) { power = 1; } lightArray[x, y, z] = power * (radius - distance) / radius; } } } } } }
public void GetFrameIndex(XYZ_d p, XYZ_d i) { i.Set(p.iX / frameLength, p.iY / frameLength, p.iZ / frameLength); }
public void Spin_XZAxis5() { position.Set(Position); cursor.x += (Cursor.Position.X - screenPoint.X) * sensitivity; cursor.y += (Cursor.Position.Y - screenPoint.Y) * sensitivity; cursor.x %= 360; cursor.y %= 360; cursor.y = cursor.y > 90 ? 90 : (cursor.y < -90 ? -90 : cursor.y); Cursor.Position = screenPoint; double degreeX = cursor.y * -PI; double degreeY = cursor.x * PI; double sinX = Math.Sin(degreeX); double sinY = Math.Sin(degreeY); double cosX = Math.Cos(degreeX); double cosY = Math.Cos(degreeY); basisX.Set(cosY, -sinY, 0); basisY.Set(cosX * sinY, cosX * cosY, -sinX).Mul(300); basisZ.Set(sinX * sinY, sinX * cosY, cosX); world.GetFrameIndex(position, PositionIndex); //현재 위치를 박스 단위 위치로 변환 world.ConvertToInfinity(PositionIndex); world.ConvertToFramePos(PositionIndex, position); // 현재 위치를 현재 박스의 로컬 좌표로 전환 Parallel.For(0, camSize.z, (int k) => { Parallel.For(0, camSize.x, (int i) => //for(int i = 0; i < camSize.x; i++) { finalBoard[i, k].Set(0); //XYZ_b lposBoard[i, k].Set(0); //XYZ_d frameBoard[i, k].x = -1;; //XYZ perspBasisX[i, k].Set(basisX).Mul(perspArray[i, k].x); perspBasisZ[i, k].Set(basisZ).Mul(perspArray[i, k].z); XYZ_d delta = deltaArray[i, k].Set(perspBasisX[i, k]).Add(basisY).Add(perspBasisZ[i, k]).Div(300); XYZ frameIndex = frameInk[i, k].Set(PositionIndex); XYZ_d target = perspBasisX[i, k]; //new XYZ_d(); XYZ deltaSign = deltaSignBoard[i, k].Set(Math.Sign(delta.x), Math.Sign(delta.y), Math.Sign(delta.z)); XYZ_d maxNumOfDelta = perspBasisZ[i, k].Set(world.frameLength).Mul(deltaSign).Div(delta); // 각 축에 대해 한 칸 이동시 delta요소들이 몇개가 필요한지. //현위치에서 delta벡터방향으로 이동할 경우 가장 먼저 만나는 경계면 구하기. target.Set(world.halfFrameLength); target.Mul(deltaSign); //delta벡터 방향으로 이동시 접촉가능한 경계면들 구하기. target.Sub(position).Div(delta); //경계면들로부터 현재위치의 거리를 구하고 delta로 나누기. deltasign으로 한번 곱했었기때문에 x,y,z축 서로에 대한 정확한 비교값이 나오게된다. // 시작 값. Block block; int nextDir = 0; // x = 0, y = 1, z = 2 int j = 0; for (j = 0; j < camSize.y; j++) { block = world.Map[frameIndex.x, frameIndex.y, frameIndex.z];//world.GetBlock(frameIndex); finalBoard[i, k].Add(block.color); if (frameBoard[i, k].x == -1 && block.touchable) { frameBoard[i, k].Set(frameIndex); target.element[nextDir] -= maxNumOfDelta.element[nextDir]; target.Sub(target.element[nextDir]); target.element[nextDir] = maxNumOfDelta.element[nextDir]; lposBoard[i, k].Set(maxNumOfDelta).Mul(0.5).Sub(target).Mul(delta); lposDirectBoard[i, k] = nextDir; } //계속 탐색 or 스톱 if (!block.OnRendered(delta, deltaSign, frameIndex, nextDir)) { break; } //다음 위치 탐색(최빈출) if (target.x < target.y) { if (target.x < target.z) { nextDir = 0; } else { nextDir = 2; } } else if (target.y < target.z) { nextDir = 1; } else { nextDir = 2; } target.element[nextDir] += maxNumOfDelta.element[nextDir]; frameIndex.element[nextDir] += deltaSign.element[nextDir]; world.ConvertToInfinity(frameIndex); //가장가까운 경계면에 해당하는 블록으로 이동. } // if (j == camSize.y)finalBoard[i, k].Add(128, 255, 255); }); }); rayDelta.Set(deltaArray[camPoint.x, camPoint.z]); }
public void GetFrameIndex(XYZ_d p, XYZ_d i) { i.Set(p.ToXYZ().Div(frameLength)); }
public void MakeCone(XYZ_d pos, int radius, int height) { XYZ frameIndex = new XYZ(); XYZ_d temp = new XYZ_d(); XYZ_d temp2 = new XYZ_d(); XYZ_d temp3 = new XYZ_d(); double distance = 0; pos.z += height; XYZ_b color = new XYZ_b(1, 1, 1); XYZ_b color2 = new XYZ_b(color).Mul(30); double degreeX = 30 * -Math.PI / 180d; double degreeY = 0 * Math.PI / 180d; double sinX = Math.Sin(degreeX); double sinY = Math.Sin(degreeY); double cosX = Math.Cos(degreeX); double cosY = Math.Cos(degreeY); XYZ_d basisX = new XYZ_d(cosY, -sinY, 0); XYZ_d basisY = new XYZ_d(cosX * sinY, cosX * cosY, -sinX); XYZ_d basisZ = new XYZ_d(sinX * sinY, sinX * cosY, cosX); for (int i = -radius - 1; i < radius + 1; i++) { for (int j = -radius - 1; j < radius + 1; j++) { for (int k = -height - 1; k < -height / 2 + 1; k++) { temp.Set(pos).Add(i, j, k); frameIndex = temp.ToXYZ(); ConvertToInfinity(frameIndex); SetBlock(frameIndex, true); SetColor(frameIndex, 0, 0, 0); SetRender(frameIndex, renderer_block); //SetColor(frameIndex,1,0,0); } } } for (int i = -radius; i < radius; i++) { for (int j = -radius; j < radius; j++) { for (int k = -height; k < -height / 2; k++) { temp.Set(pos).Add(i, j, k); frameIndex = temp.ToXYZ(); ConvertToInfinity(frameIndex); SetBlock(frameIndex, false); SetRender(frameIndex, renderer_air); //SetColor(frameIndex,1,0,0); } } } //frameIndex = pos.ToXYZ(); //ConvertToInfinity(frameIndex); //frameIndex.z -= height - 10; temp.Set(pos).Sub(0, 10, height - 10); for (int i = -2; i <= 2; i++) { for (int j = -2; j <= 2; j++) { for (int k = -2; k <= 2; k++) { temp2.Set(temp).Add(i, j, k); frameIndex = temp2.ToXYZ(); ConvertToInfinity(frameIndex); SetBlock(frameIndex, true); SetRender(frameIndex, renderer_block); } } } for (int i = -radius; i < radius; i++) { for (int j = -radius; j < radius; j++) { temp.Set(pos).Add(i, j, 0); distance = pos.Distance(temp); if (distance < radius) { frameIndex = temp.ToXYZ(); ConvertToInfinity(frameIndex); //SetColor(frameIndex,color); temp2.Set(temp).Sub(pos).Add(0, 0, height).Div(height); temp2.Set(basisX.x * temp2.x + basisY.x * temp2.y + basisZ.x * temp2.z, basisX.y * temp2.x + basisY.y * temp2.y + basisZ.y * temp2.z, basisX.z * temp2.x + basisY.z * temp2.y + basisZ.z * temp2.z); temp2.Div(temp2.Length()); //temp2.Set(temp3); temp.Set(pos).Add(0, 0, -height); /*******************************************************************************/ /* frameIndex = temp.ToXYZ(); * XYZ deltaSign = new XYZ(Math.Sign(temp2.x),Math.Sign(temp2.y),Math.Sign(temp2.z)); * int nextDir = 0; * XYZ_d maxNumOfDelta = new XYZ_d(frameLength).Mul(deltaSign).Div(temp2); * XYZ_d target = new XYZ_d(halfFrameLength); * target.Mul(deltaSign);//delta벡터 방향으로 이동시 접촉가능한 경계면들 구하기. * target.Div(temp2); */ //XYZ gap = new XYZ(frameIndex); //color.Set(2,2,2); //byte code = 0; for (int k = 0; k < height * 1.5f; k++) { temp.Add(temp2); frameIndex = temp.ToXYZ(); /* if (target.x < target.y) * if(target.x < target.z) nextDir = 0; * else nextDir = 2; * else * if(target.y < target.z) nextDir = 1; * else nextDir = 2; */ //target.element[nextDir] += maxNumOfDelta.element[nextDir]; //frameIndex.element[nextDir] += deltaSign.element[nextDir]; ConvertToInfinity(frameIndex); if (isFrameEnabled(frameIndex)) { AddColor(frameIndex, color2); break; } else { AddColor(frameIndex, color); } //SetBlock(frameIndex,code); //gap.Set(frameIndex); //Console.WriteLine(nextDir); } } } } }
public void Spin_XZAxis5() { position.Set(Position); cursor.x += (Cursor.Position.X - screenPoint.X) * sensitivity; cursor.y += (Cursor.Position.Y - screenPoint.Y) * sensitivity; cursor.x %= 360; cursor.y %= 360; cursor.y = cursor.y > 90 ? 90 : (cursor.y < -90 ? -90 : cursor.y); Cursor.Position = screenPoint; double degreeX = cursor.y * -PI; double degreeY = cursor.x * PI; double sinX = Math.Sin(degreeX); double sinY = Math.Sin(degreeY); double cosX = Math.Cos(degreeX); double cosY = Math.Cos(degreeY); bool isTargetSet = false; basisX.Set(1, 0, 0); basisY.Set(0, camSize.y - 1, 0); basisZ.Set(0, 0, 1); Spin_matrix_x(basisX.x, basisX.y, basisX.z, sinX, cosX, basisX); Spin_matrix_z(basisX.x, basisX.y, basisX.z, sinY, cosY, basisX); Spin_matrix_x(basisY.x, basisY.y, basisY.z, sinX, cosX, basisY); Spin_matrix_z(basisY.x, basisY.y, basisY.z, sinY, cosY, basisY); Spin_matrix_x(basisZ.x, basisZ.y, basisZ.z, sinX, cosX, basisZ); Spin_matrix_z(basisZ.x, basisZ.y, basisZ.z, sinY, cosY, basisZ); world.GetFrameIndex(position, PositionIndex); // Parallel.For(0,camSize.z,(int k) => for (int k = 0; k < camSize.z; k++) { //Parallel.For(0,camSize.x,(int i) => for (int i = 0; i < camSize.x; i++) { XYZ_b color = new XYZ_b(); Block block; perspBasisX[i, k].Set(basisX).Mul(perspArray[i, k].x); perspBasisZ[i, k].Set(basisZ).Mul(perspArray[i, k].z); spinArray[i, k].Set(perspBasisX[i, k]).Add(basisY).Add(perspBasisZ[i, k]); XYZ_d delta = deltaArray[i, k].Set(spinArray[i, k]).Div(camSize.y); XYZ_d index = indexArray[i, k].Set(position); XYZ_d gap = new XYZ_d(); XYZ_d lpos = new XYZ_d(); XYZ frameIndex = new XYZ(); XYZ nextFrameIndexDelta = new XYZ(); XYZ_d target = new XYZ_d(); XYZ_d deltaSign = new XYZ_d(); if (delta.x != 0) { deltaSign.x = (Math.Abs(delta.x) / delta.x); } if (delta.y != 0) { deltaSign.y = (Math.Abs(delta.y) / delta.y); } if (delta.z != 0) { deltaSign.z = (Math.Abs(delta.z) / delta.z); } frameIndex.Set(PositionIndex); double numOfDelta = 0; for (int j = 0; j < camSize.y; j++) { if (!world.IsInFrame(frameIndex) || j == camSize.y - 1) { break; } world.ConvertToFramePos(lpos.Set(index), frameIndex); // index를 frameIndex에 해당하는 블록의 로컬포지션으로 변환. if (world.IsExistPixelInFrame(frameIndex)) { block = world.GetBlock(frameIndex); board[i, k] = index; if (i == camPoint.x && k == camPoint.z && !isTargetSet) { deleteFrameIndex.Set(frameIndex); addFrameIndex.Set(frameIndex).Sub(nextFrameIndexDelta); isTargetSet = true; } XYZ_b inv_color = new XYZ_b(255).Sub(block.color); if (frameIndex.Equal(deleteFrameIndex))//쳐다보는 블록면 강조 { XYZ vector = new XYZ(addFrameIndex).Sub(deleteFrameIndex); if (vector.x != 0 && lpos.x * vector.x > world.frameLength / 2 - 1) { viewer.Draw(i, k, inv_color); break; } else if (vector.y != 0 && lpos.y * vector.y > world.frameLength / 2 - 1) { viewer.Draw(i, k, inv_color); break; } else if (vector.z != 0 && lpos.z * vector.z > world.frameLength / 2 - 1) { viewer.Draw(i, k, inv_color); break; } } if (gridEnabled && block.code != 14) // 경계선표시. { bool Xaxis = Math.Abs(lpos.x) > world.frameLength / 2 - 1; //경계선 테두리 크기 1 bool Yaxis = Math.Abs(lpos.y) > world.frameLength / 2 - 1; bool Zaxis = Math.Abs(lpos.z) > world.frameLength / 2 - 1; if (Xaxis && Yaxis) { viewer.Draw(i, k, inv_color); break; } if (Yaxis && Zaxis) { viewer.Draw(i, k, inv_color); break; } if (Zaxis && Xaxis) { viewer.Draw(i, k, inv_color); break; } } if (block.code == 14) // 거울만나면 반사. { color.Set(block.color); if (nextFrameIndexDelta.x != 0) { delta.x = -delta.x; deltaSign.x = -deltaSign.x; } else if (nextFrameIndexDelta.y != 0) { delta.y = -delta.y; deltaSign.y = -deltaSign.y; } else if (nextFrameIndexDelta.z != 0) { delta.z = -delta.z; deltaSign.z = -deltaSign.z; } frameIndex.Sub(nextFrameIndexDelta); // 일보후퇴 continue; } else if (block.code == 15) // 유리만나면 살짝 하얘지고 계속 진행. { color.Add(10); } else { color.Add(block.color); viewer.Draw(i, k, color); break; } } //현위치에서 delta벡터방향으로 이동할 경우 가장 먼저 만나는 경계면 구하기. target.Set(world.frameLength / 2); target.Mul(deltaSign); //delta벡터 방향으로 이동시 접촉가능한 경계면들 구하기. target.Sub(lpos).Div(delta); //경계면들로부터 현재위치의 거리를 구하고 delta로 나누기. deltasign으로 한번 곱했었기때문에 x,y,z축 서로에 대한 정확한 비교값이 나오게된다. nextFrameIndexDelta.Set(0); if (target.x < target.y && target.x < target.z) { numOfDelta = target.x; nextFrameIndexDelta.x = (int)deltaSign.x; } else if (target.y < target.x && target.y < target.z) { numOfDelta = target.y; nextFrameIndexDelta.y = (int)deltaSign.y; } else if (target.z < target.x && target.z < target.y) { numOfDelta = target.z; nextFrameIndexDelta.z = (int)deltaSign.z; } frameIndex.Add(nextFrameIndexDelta); //가장가까운 경계면에 해당하는 블록으로 이동. index.Add(gap.Set(delta).Mul(numOfDelta)); //delta방향으로 가장 가까운 경계면으로 이동. //여기까지 수정 } } //); } //); rayDelta.Set(deltaArray[camPoint.x, camPoint.z]); for (int i = camPoint.z - 3; i < camPoint.z + 3; i++) { for (int j = camPoint.x - 3; j < camPoint.x + 3; j++) { if (Math.Pow(i - camPoint.z, 2) + Math.Pow(j - camPoint.x, 2) < 8 && Math.Pow(i - camPoint.z, 2) + Math.Pow(j - camPoint.x, 2) > 4) { viewer.Draw(j, i, new XYZ_b(255)); } } } }