using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
//해야될일 7개 +-*/><=에 대해 예제를 만들어보라
// *
// /
// >
// <
// =
namespace MyMath
{
struct Vector3
{
private double _x;
private double _y;
private double _z;
//외부는 이 클래스 외 다른 공간
//일반적으로 private 멤버 생성자는 _를 쓴다
//타입은 마우스 갖다대면 다 나오니깐 그냥 멤버앞에 언더바
//지역변수가 멤버랑 겹치는 경우가 있으므로 언더바
public Vector3(double x, double y, double z) //double x,y,z를 인자로 받는 생성자
{
_x = x;
_y = y;
_z = z;
}
public Vector3(Vector3 rhs)//인자로 vector3를 받는 생성자
{
_x = rhs._x;
_y = rhs._y;
_z = rhs._z;
}
//이 방법이 c# 특성상 자주 사용된다 operator c c++ c# 공통. 이 안에 모두 포함
//결과값이 vector 값이여야 된다
public static Vector3 operator +(Vector3 v1, Vector3 v2)
{
return new Vector3(v1.X + v2.X, v1.Y + v2.Y, v1.Z + v2.Z);
}//Vector3와 Vector3의 + 이항연산 오버로딩
public static Vector3 operator +(Vector3 v1, double v2)
{
return new Vector3(v1.X + v2, v1.Y + v2, v1.Z + v2);
}//Vector3와 double형의 + 이항연산 오버로딩
public static Vector3 operator +(double v1, Vector3 v2)
{
return v2 + v1;
}//앞에 재정의한 Vector3와 double형의 + 이항연산 오버로딩을 활용한 오버로딩
//중복을 줄이는거 바로 위의 연산을 줄인거지
public static Vector3 operator -(Vector3 v1, Vector3 v2)
{
return new Vector3(v1.X - v2.X, v1.Y - v2.Y, v1.Z - v2.Z);
}//Vector3와 Vector3의 - 이항연산 오버로딩
public static Vector3 operator -(Vector3 v1, double v2)
{
return new Vector3(v1.X - v2, v1.Y - v2, v1.Z - v2);
}//Vector3와 double의 - 이항연산 오버로딩
public static Vector3 operator -(double v1, Vector3 v2)
{
return v2 - v1;
}//앞에 재정의한 Vector3와 double의 - 이항연산 오버로딩을 이용한 오버로딩
public static Vector3 operator *(Vector3 v1, Vector3 v2)
{
return new Vector3(v1.X * v2.X, v1.Y * v2.Y, v1.Z * v2.Z);
}//Vector3와 Vector3의 곱셈 이항연산 오버로딩
public static Vector3 operator *(Vector3 v1, double v2)
{
return new Vector3(v1.X * v2, v1.Y * v2, v1.Z * v2);
}//Vector와 double형의 이항연산 오버로딩
public static Vector3 operator *(double s1, Vector3 v2)
{
return v2 * s1;
}//앞에 재정의한 *연산을 이용
public static Vector3 operator *(Vector3 v1, float v2)
{
return new Vector3(v1.X * v2, v1.Y * v2, v1.Z * v2);
}//double 대신 float만 바꿈
public static Vector3 operator *(float v1, Vector3 v2)
{
return v2 * v1;
}//앞에 재정의한 *연산을 이용
public static Vector3 operator /(Vector3 v1, Vector3 v2)
{
return new Vector3(v1.X / v2.X, v1.Y / v2.Y, v1.Z / v2.Z);
}// v1 / v2 하여 결과를 인자로 받는 Vector3를 new하고 그 Vector3를 리턴
// division by zero 같은건 여기서 예외로함
public static bool operator >(Vector3 v1, Vector3 v2)
{
return (v1.Length > v2.Length);
}//v1.Length와 v2.Length를 실행하고 크기를 비교하는 >연산으로 결과를 return
public static bool operator <(Vector3 v1, Vector3 v2)
{
return (v1.Length < v2.Length);
}//v1.Length와 v2.Length를 실행하고 크기를 비교하는 <연산으로 결과를 return
public static bool operator ==(Vector3 v1, Vector3 v2)
{
return Math.Equals(v1.X, v2.X) &&
Math.Equals(v1.Y, v2.Y) &&
Math.Equals(v1.Z, v2.Z);
}//v1하고 v2의 X,Y,Z값을 Math.Equals()함수로 각각 비교 후 다시 and한다..
//1개라도 같지 않으면 false 리턴
// float.Epsilon; 요게 뭐당가
public static bool operator !=(Vector3 v1, Vector3 v2)
{
return !(v1 == v2);
}//이항연산자 v1==v2를 실행하고 나온 리턴값에 !(not)을 해서 bool값을 return한다
public override string ToString()
{
return "(" + _x.ToString() + ", " + _y.ToString() + ", " + _z.ToString() + ")";
}//ToString 오버라이드
//멤버변수에서 언더바 빼고 대분자로 만든다
public double X
{
get { return _x; }//_x 값을 리턴한다
set { _x = value; }//입력값을 _z에 넣는다
}
public double Y
{
get { return _y; }//_y 값을 리턴한다
set { _y = value; }//입력값을 _y에 넣는다
}
public double Z
{
get { return _z; }//_z 값을 리턴한다
set { _z = value; }//입력값을 _z 에 넣는다
}
public double Length //벡터의 length를 구하는 함수
{
get { return Math.Sqrt(_x * _x + _y * _y + _z * _z); }
//현대시피유로는 쉽지만 오버해드가 있다 어느정도
//매번 가져올때마다 이걸로 길이를 구하는게 별로다...그래서 length 변수로 xyz값이 바뀌면 자동으로 변하게
//set은 없으므로 값을 얻어올 수만 있다
}
}
}
'컴퓨터 과학 & 영상처리 관련 > C# / .NET / JAVA' 카테고리의 다른 글
c# 파일 크기 확인 (0) | 2012.12.07 |
---|---|
c#에서 포인터 사용할때 (unsafe { }) (0) | 2012.10.15 |
c# 디렉토리, 파일 어느쪽에 해당하는지 알고싶을때 (0) | 2012.02.29 |
c# 다중 스레드에서의 접근 문제 (0) | 2012.02.05 |
c# debug class (0) | 2012.02.05 |