diff --git a/src/main/kotlin/Service/FlowDrawer.kt b/src/main/kotlin/Service/FlowDrawer.kt index 94d2eb4a7b8f1b3ef4f0e3bc2eff96a34c3a2254..9e3f829bd34ffc5ad23f1308a8e21f490ba71b06 100644 --- a/src/main/kotlin/Service/FlowDrawer.kt +++ b/src/main/kotlin/Service/FlowDrawer.kt @@ -13,10 +13,12 @@ import kotlin.random.Random const val MAX_RADAR_SEGMENT = 143 const val MIN_DATA_VALUE = -10.0 const val MAX_DATA_VALUE = 50.0 +const val MAX_RADAR_DISTANCE = 60.0 class FlowDrawer(private val title: String, private val flowData: Flow<ResponseData>, - minDataValue: Double = MIN_DATA_VALUE, maxDataValue: Double = MAX_DATA_VALUE) { - private val radar = Radar(MAX_RADAR_SEGMENT, 0.0, 2 * PI, minDataValue, maxDataValue) + minDataValue: Double = MIN_DATA_VALUE, maxDataValue: Double = MAX_DATA_VALUE, + maxRadarDistance: Double = MAX_RADAR_DISTANCE) { + private val radar = Radar(MAX_RADAR_SEGMENT, 0.0, 2 * PI, minDataValue, maxDataValue, maxRadarDistance) fun draw(): Pair<Job, Job> { val window = Window(title, radar) diff --git a/src/main/kotlin/drawing/Character.kt b/src/main/kotlin/drawing/Character.kt index bf15a4d2932d4e552c95406f00284b0c8ef77890..6662c382a7e528170cdcfcfb3ebb4ee4ba7a0c07 100644 --- a/src/main/kotlin/drawing/Character.kt +++ b/src/main/kotlin/drawing/Character.kt @@ -15,20 +15,44 @@ import java.nio.file.Paths const val CHARACTER_TEXTURE = "textures/Numbermap.png" class Character { - fun renderCharacter(char: Char, x: Float, y: Float) { + fun renderText(string: String, x: Float = -0.9f, y: Float = -0.9f, scale : Float = 0.6f) { + val characterSize = Point(1/26.0, 0.1).scale(scale.toDouble()) + for (i in string.indices) { + renderCharacter(string[i], x + i * characterSize.x.toFloat(), y, scale) + } + } + fun renderTextAlignRight(string: String, x: Float = -0.9f, y: Float = -0.9f, maxNumOfCharacters: Int, scale : Float = 0.6f) { + val characterSize = Point(1/26.0, 0.1).scale(scale.toDouble()) + for (i in string.indices) { + renderCharacter(string[i], x + (i + maxNumOfCharacters - string.length) * characterSize.x.toFloat(), y, scale) + } + } + fun renderTextAlignCenter(string: String, x: Float = -0.9f, y: Float = -0.9f, maxNumOfCharacters: Int, scale : Float = 0.6f) { + val characterSize = Point(1/26.0, 0.1).scale(scale.toDouble()) + for (i in string.indices) { + renderCharacter(string[i], x + (i + (maxNumOfCharacters - string.length)/2) * characterSize.x.toFloat(), y, scale) + } + } + private fun renderCharacter(char: Char, x: Float = -.9f, y: Float = 0f, scale: Float = 0.6f) { + val bottomLeftTextureCoordinate = Point(characterMap[char]!! / 13.0, 0.0) + val topRightTextureCoordinate = Point((characterMap[char]!! + 1) / 13.0, 1.0) + val characterSize = Point(1/26.0, 0.1).scale(scale.toDouble()) + + glEnable(GL_TEXTURE_2D) glBindTexture(GL_TEXTURE_2D, textureId) glColor3d(1.0, 1.0, 1.0) glBegin(GL_QUADS) - glTexCoord2f(0.0f, 1.0f) - glVertex3f(-0.9f, 0.0f, 0.0f) - glTexCoord2f(1.0f, 1.0f) - glVertex3f(-0.4f, 0.0f, 0.0f) - glTexCoord2f(1.0f, 0.0f) - glVertex3f(-0.4f, 0.1f, 0.0f) - glTexCoord2f(0.0f, 0.0f) - glVertex3f(-0.9f, 0.1f, 0.0f) + glTexCoord2d(bottomLeftTextureCoordinate.x, topRightTextureCoordinate.y) + glVertex3f(x, y, 0.0f) + glTexCoord2d(topRightTextureCoordinate.x, topRightTextureCoordinate.y) + glVertex3f(x + characterSize.x.toFloat(), y, 0.0f) + glTexCoord2d(topRightTextureCoordinate.x, bottomLeftTextureCoordinate.y) + glVertex3f(x + characterSize.x.toFloat(), y + characterSize.y.toFloat(), 0.0f) + glTexCoord2d(bottomLeftTextureCoordinate.x, bottomLeftTextureCoordinate.y) + glVertex3f(x, y + characterSize.y.toFloat(), 0.0f) glEnd() + glDisable(GL_TEXTURE_2D) } companion object { @@ -52,6 +76,8 @@ class Character { '.' to 12, ) + val mapLength: Int = characterMap.size + init { // Load the image val imageBuffer = loadImageFromResources(CHARACTER_TEXTURE) diff --git a/src/main/kotlin/drawing/Draw.kt b/src/main/kotlin/drawing/Draw.kt index a5327b3b7d53560dec7339026c7605eeaab92e39..b3de8e3b7e899da46c40182128a3a1b88918578b 100644 --- a/src/main/kotlin/drawing/Draw.kt +++ b/src/main/kotlin/drawing/Draw.kt @@ -246,10 +246,50 @@ class Draw { glVertex2d(points[0].x, points[0].y) glEnd() } + private fun radarPlotVerticalAxesNumbers(radar: Radar, center: Point, windowWidth: Int, windowHeight: Int, size: Double, numOfScale: Int) { + val character = Character() + val scaleList = mutableListOf<String>() + for (i in 0 until numOfScale) { + scaleList.add("%d".format((-radar.maxDistance + i * (radar.maxDistance * 2 / (numOfScale - 1))).toInt())) + } + val maxCharacterLength: Int = scaleList.maxBy { it -> it.length.toInt() }.length + val widerDimension: Double = max(windowWidth, windowHeight).toDouble() + val fixedXRatio = windowHeight / widerDimension + val fixedYRatio = windowWidth / widerDimension + val minPoint = Point(-size / 2, -size / 2) + .scale(fixedXRatio, fixedYRatio) + .translate(center) + .translate(-0.1, -0.03) + val interval = Point(0.0, size * fixedYRatio / (numOfScale - 1)) + for (i in scaleList.indices) { + character.renderTextAlignRight(scaleList[i], minPoint.x.toFloat(), (minPoint.y + i * interval.y).toFloat(), maxCharacterLength) + } + } + private fun radarPlotHorizontalAxesNumbers(radar: Radar, center: Point, windowWidth: Int, windowHeight: Int, size: Double, numOfScale: Int) { + val character = Character() + val scaleList = mutableListOf<String>() + for (i in 0 until numOfScale) { + scaleList.add("%d".format((-radar.maxDistance + i * (radar.maxDistance * 2 / (numOfScale - 1))).toInt())) + } + val maxCharacterLength: Int = scaleList.maxBy { it -> it.length.toInt() }.length + val widerDimension: Double = max(windowWidth, windowHeight).toDouble() + val fixedXRatio = windowHeight / widerDimension + val fixedYRatio = windowWidth / widerDimension + val minPoint = Point(-size / 2, -size / 2) + .scale(fixedXRatio, fixedYRatio) + .translate(center) + .translate(-0.04, -0.1) + val interval = Point(size * fixedXRatio / (numOfScale - 1), 0.0) + for (i in scaleList.indices) { + character.renderTextAlignCenter(scaleList[i], (minPoint.x + i * interval.x).toFloat(), minPoint.y.toFloat(), maxCharacterLength) + } + } fun radar(radar: Radar, windowWidth: Int, windowHeight: Int, center: Point = Point(-0.1, 0.0), size: Double = 1.5, numOfScale: Int = 5) { radarValues(radar, windowWidth, windowHeight, center, size) radarPlotSquare(center, windowWidth, windowHeight, size) radarPlotAxes(center, windowWidth, windowHeight, size, numOfScale) + radarPlotVerticalAxesNumbers(radar, center, windowWidth, windowHeight, size, numOfScale) + radarPlotHorizontalAxesNumbers(radar, center, windowWidth, windowHeight, size, numOfScale) } private fun radarScaleGradient(radarScale: RadarScale, center: Point, height: Double, width: Double) { val gradient: ColorInterpolation = radarScale.colorGradient @@ -299,10 +339,23 @@ class Draw { } glEnd() } + private fun radarScaleNumbers(radarScale: RadarScale, center: Point, height: Double, width: Double) { + val character = Character() + val scaleList = mutableListOf<String>() + for (i in 0 until radarScale.numOfScale) { + scaleList.add("%.1f".format(radarScale.minimumValue + i * (radarScale.maximumValue - radarScale.minimumValue) / (radarScale.numOfScale - 1))) + } + val startingPoint = center.clone().translate(width / 2 + 0.03, -height / 2 - 0.04) + val interval = Point(0.0, height / (radarScale.numOfScale - 1)) + for (i in scaleList.indices) { + character.renderText(scaleList[i], startingPoint.x.toFloat(), (startingPoint.y + i * interval.y).toFloat()) + } + } fun radarScale(radarScale: RadarScale, center: Point = Point(0.7, 0.0), height: Double = 1.5, width: Double = 0.1) { radarScaleGradient(radarScale, center, height, width) radarScaleOuterSquare(center, height, width) radarScaleStripes(radarScale, center, height, width) + radarScaleNumbers(radarScale, center, height, width) } } } \ No newline at end of file diff --git a/src/main/kotlin/radar/Radar.kt b/src/main/kotlin/radar/Radar.kt index 6f6b481c44f12e13112398340385e44a12fd3379..82f66c0235824707889d1a5ebdbc025fe8d5e5ac 100644 --- a/src/main/kotlin/radar/Radar.kt +++ b/src/main/kotlin/radar/Radar.kt @@ -25,6 +25,7 @@ class Radar (numSegments: Int) { private var minValue: Double = 0.0 private var maxValue: Double = 20.0 private var radarColors: ColorInterpolation = ColorInterpolation() + var maxDistance: Double = 60.0 constructor(numSegments: Int, maxAngle: Double) : this(numSegments) { this.maxAngle = maxAngle } @@ -41,9 +42,18 @@ class Radar (numSegments: Int) { this.minValue = minValue this.maxValue = maxValue } + constructor(numSegments: Int, minAngle: Double, maxAngle: Double, minValue: Double, maxValue: Double, maxDistance: Double) : this(numSegments, minAngle, maxAngle) { + this.minValue = minValue + this.maxValue = maxValue + this.maxDistance = maxDistance + } constructor(numSegments: Int, minAngle: Double, maxAngle: Double, minValue: Double, maxValue: Double, radarColors: ColorInterpolation) : this(numSegments, minAngle, maxAngle, minValue, maxValue) { this.radarColors = radarColors } + constructor(numSegments: Int, minAngle: Double, maxAngle: Double, minValue: Double, maxValue: Double, maxDistance: Double, radarColors: ColorInterpolation) : this(numSegments, minAngle, maxAngle, minValue, maxValue) { + this.radarColors = radarColors + this.maxDistance = maxDistance + } // Methods override fun toString() : String { diff --git a/src/main/kotlin/radar/RadarScale.kt b/src/main/kotlin/radar/RadarScale.kt index 29c3e39d011d9c79b9aea02dec3c09c72fe88a16..813ddddf232d97681143888dabfe09fd50752d68 100644 --- a/src/main/kotlin/radar/RadarScale.kt +++ b/src/main/kotlin/radar/RadarScale.kt @@ -9,4 +9,8 @@ class RadarScale(var minimumValue: Float, var maximumValue: Float, var numOfScal this.colorGradient = colorGradient } constructor() : this(0f, 20f, 5) + constructor(radar: Radar) : this(radar.getMinimumValue().toFloat(), radar.getMaximumValue().toFloat(), 5) + constructor(radar: Radar, numOfScale: Int) : this(radar) { + this.numOfScale = numOfScale + } } \ No newline at end of file diff --git a/src/main/kotlin/window/Window.kt b/src/main/kotlin/window/Window.kt index e135cb15611ea2d394f00a4219b39a1eb1567e63..be083623861ae4d2cd67a5585c5d836e09effeb1 100755 --- a/src/main/kotlin/window/Window.kt +++ b/src/main/kotlin/window/Window.kt @@ -23,7 +23,7 @@ import kotlin.random.Random class Window(private val windowTitle: String, private val radar: Radar) { private var window: Long = NULL; - private var radarScale = RadarScale() + private var radarScale = RadarScale(radar) private var windowWidth: Int = 800 private var windowHeight: Int = 600 @@ -86,15 +86,9 @@ class Window(private val windowTitle: String, private val radar: Radar) { while(!glfwWindowShouldClose(window)){ glClear(GL_COLOR_BUFFER_BIT or GL_DEPTH_BUFFER_BIT) - - glDisable(GL_TEXTURE_2D) - Draw.radar(radar, windowWidth, windowHeight) Draw.radarScale(radarScale) - glEnable(GL_TEXTURE_2D) - character.renderCharacter('1', 0.0f ,0.0f) - glfwSwapBuffers(window) glfwPollEvents() }