Line
1. Paralel Çizgiler
İki çizgi eğimleri eşitse birbirlerine paraleldir.
İki çizginin dot product sonucu 0 ise bu çizgiler diktir. dot product kodlamak için şöyle yaparız.
Bir çizgiye dik çizgi üretmek için şöyle yaparız
2 boyutlu noktanın bir şeklin içinde olup olmadığı şöyle bulunur. Noktanın x değeri [shape.x.min,shape.x.min] kapalı aralığında, y değeride [shape.y.min,shape.y.min] kapalı aralıında ise nokta şeklin içindedir.
3 boyutlu nokta düz bir dizide şöyle tutulur.
Basit Shape Sınıfı - Daire yazısına taşıdım.
Üçgen
Açıklaması şöyle.
1. Paralel Çizgiler
İki çizgi eğimleri eşitse birbirlerine paraleldir.
public boolean isParallelTo (Line other) {
return other.Slope == this.Slope;
}
2. Dik Çizgilerİki çizginin dot product sonucu 0 ise bu çizgiler diktir. dot product kodlamak için şöyle yaparız.
float dot_product(float *vector1, float vector2[],int dimension){
float sum = 0;
for (int i = 0; i < dimension; i++){
sum += (vector1[i])*(vector2[i]);
}
return sum;
}
Bu kodu C++ ile kodlamak için hazır gelen std::inner_product() meodunu kullanarak şöyle yaparız.std::inner_product(a.cbegin(), a.cend(), b.cbegin(), float(0.0));
ÖrnekBir çizgiye dik çizgi üretmek için şöyle yaparız
std::vector<float> generate_orthogonal(const std::vector<float>& a) {
// get some random data
std::vector<float> b = generate_random(a.size());
// find the last non zero entry in a
// We have to turn the reverse iterator into an iterator via std::prev(rit.base())
auto IsZero = [] (const float f) -> bool { return f == float(0.0);};
auto end = std::prev(std::find_if_not(a.crbegin(), a.crend(), IsZero).base());
// determine the dot product up to end
float dot_product = std::inner_product(a.cbegin(), end, b.cbegin(), float(0.0));
// set the value of b so that the inner product is zero
b[std::distance(a.cbegin(), end)] = - dot_product / (*end);
return b;
}
2 Boyutlu Nokta2 boyutlu noktanın bir şeklin içinde olup olmadığı şöyle bulunur. Noktanın x değeri [shape.x.min,shape.x.min] kapalı aralığında, y değeride [shape.y.min,shape.y.min] kapalı aralıında ise nokta şeklin içindedir.
class Point {
public boolean isInside(Shape s) {
ArrayList<Point> points = s.edgePoints()
return this.x >= points.map(getX).min && \
this.x <= points.map(getX).max && \
this.y >= points.map(getX).min && \
this.y <= points.map(getX).min
}
}
3 Boyutlu Nokta3 boyutlu nokta düz bir dizide şöyle tutulur.
// Thin wrapper around flatten vector
template<typename T>
class Array3D
{
std::size_t _X, _Y, _Z;
std::vector<T> _vec;
public:
Array3D(std::size_t X, std::size_t Y, std::size_t Z):
_X(X), _Y(Y), _Z(Z), _vec(_X * _Y * _Z) {}
T& operator()(std::size_t x, std::size_t y, std::size_t z)
{
return _vec[(x * _Y + y) * _Z + z];
}
};
DaireBasit Shape Sınıfı - Daire yazısına taşıdım.
Üçgen
Dik üçgen olup olmadığını anlamak için şöyle yaparız.
Şöyle tanımlarız.
Collision Detection yazısına taşıdım.
(a,b,c)-> // Method with three integer parameters and boolean return-type
(a*=a)+(b*=b)==(c*=c) // Return if `a*a + b*b == c*c`
|a+c==b // or `a*a + c*c == b*b`
|b+c==a // or `b*b + c*c == a*a`
// End of method (implicit / single-line return-statement)
3 kenarın uzunluğunu biliyorsak bunların bir üçgen olup olmadığını anlamak için açıklama şöyleChecks if a+b+c > max(a,b,c)*2. If, say, c is the biggest one, this is equivalent to a+b+c>2*c, or a+b>c, which is want we want for the triangle inequality.Şöyle yaparız.
(a,b,c)->a+b>c&a+c>b&b+c>a
DikdörtgenŞöyle tanımlarız.
struct rect
{
int x;
int y;
int width;
int height;
};
overlap metoduCollision Detection yazısına taşıdım.
Elips
Matematiksel olarak her daire bir elips olarak tarif ediliyor olabilir. Yani aynı değere sahip iki tane odak noktası olarak düşünülüyor deniliyor. Ancak programlama açısından çok doğru değil. Şu kalıtım bir sürü problem sebep oluyor.
fi (yatay açı) ve theta (dikey açı) değerlerinden X,Y,Z noktalarına dönmek için şöyle yaparız.
N köşeli normal bir polygon'un iç açısını bulmak için şöyle yaparız. 360 /N işleminin sonucunu 180'den çıkarırız.
Basit bir Vector sınıfıMatematiksel olarak her daire bir elips olarak tarif ediliyor olabilir. Yani aynı değere sahip iki tane odak noktası olarak düşünülüyor deniliyor. Ancak programlama açısından çok doğru değil. Şu kalıtım bir sürü problem sebep oluyor.
class Circle : public Elipse
{...}
En iyisi daireden elipse çevrim yapmak. Şöyle yaparız.class Elipse
{
// as you defined
};
class Circle
{
// As you defined
explicit operator Ellipse()
{
Point lower_left, upper_right;
// calculate the two points
return Ellipse(lower_left, upper_right);
}
};
Küre (Sphere)fi (yatay açı) ve theta (dikey açı) değerlerinden X,Y,Z noktalarına dönmek için şöyle yaparız.
x = x0 + r * Cos(fi) * Sin(theta)
y = y0 + r * Sin(fi) * Sin(theta)
z = z0 + r * Cos(theta)
PolygonN köşeli normal bir polygon'un iç açısını bulmak için şöyle yaparız. 360 /N işleminin sonucunu 180'den çıkarırız.
n=>180-360/n
Vectorclass Vector {
private final int x;
private final int y;
public Vector(int x, int y) {
this.x = x;
this.y = y;
}
public Vector add(Vector other) {
return new Vector(x + other.x, y + other.y);
}
public Vector sub(Vector other) {
return new Vector(x - other.x, y - other.y);
}
public Vector mul(Vector other) {
return new Vector(x * other.x, y * other.y);
}
}
ÇarpmaAçıklaması şöyle.
The two fundamental operations for numbers are "addition" and "multiplication" which obey very nice "laws" of arithmetic. Taking powers is also important. You can do all of those things with complex numbers. You can add two vectors but the "dot" product of two vectors is not a vector and the "cross" product of two vectors does not satisfy the "nice laws". Neither the dot product nor the cross product of vectors can be used to define powers.
Hiç yorum yok:
Yorum Gönder