All Downloads are FREE. Search and download functionalities are using the official Maven repository.

commonMain.ru.casperix.math.geometry.Triangle.kt Maven / Gradle / Ivy

package ru.casperix.math.geometry

import ru.casperix.math.vector.float32.Vector2f
import ru.casperix.math.vector.float32.Vector3f
import ru.casperix.math.vector.float64.Vector2d
import ru.casperix.math.vector.float64.Vector3d
import ru.casperix.math.vector.int32.Vector2i
import kotlinx.serialization.Serializable


/**
 * 	   1|\
 * 	    |   \
 * 	0|----\2
 */
@Serializable
data class Triangle(val v0: Point, val v1: Point, val v2: Point) : Polygon {

	override fun  convert(converter: (Point) -> TargetPoint): Triangle {
		return Triangle(
				converter(v0),
				converter(v1),
				converter(v2)
		)
	}

	override fun getVertexAmount(): Int {
		return 3
	}

	override fun getVertex(index: Int): Point {
		return when (index) {
			0 -> v0
			1 -> v1
			2 -> v2
			else -> throw Error("Invalid index")
		}
	}

	override fun getEdge(index: Int): Line {
		return when (index) {
			0 -> Line(v0, v1)
			1 -> Line(v1, v2)
			2 -> Line(v2, v0)
			else -> throw Error("Expected index in range 0 - 2. Actual: $index")
		}

	}


	override fun getEdgeAmount(): Int {
		return 3
	}

	override fun getEdgeList(): List> {
		return (0 until getEdgeAmount()).map {
			getEdge(it)
		}
	}

	override fun toString(): String {
		return "Tri(v0=$v0, v1=$v1, v2=$v2)"
	}

	companion object {
		fun  from(list: List): Triangle? {
			if (list.size != 3) return null
			return Triangle(list[0], list[1], list[2])
		}
	}
}

fun Triangle3d.getNormal(): Vector3d {
	return getTriangleNormal(v0, v1, v2)
}

fun Triangle3d.scale(scale: Double): Triangle3d {
	val center = (v0 + v1 + v2) / 3.0
	return Triangle3d(center + (v0 - center) * scale, center + (v1 - center) * scale, center + (v2 - center) * scale)
}

fun getTriangleNormal(v0: Vector3d, v1: Vector3d, v2: Vector3d): Vector3d {
	return (v2 - v0).cross(v1 - v0).normalize()
}

typealias Triangle3d = Triangle
typealias Triangle2d = Triangle

typealias Triangle3f = Triangle
typealias Triangle2f = Triangle
typealias Triangle2i = Triangle




© 2015 - 2024 Weber Informatics LLC | Privacy Policy