|
@ -26,6 +26,7 @@ class CanvasPendulum @JvmOverloads constructor( |
|
|
this.canvas = it |
|
|
this.canvas = it |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
//println("ONDRAW") |
|
|
//draw line |
|
|
//draw line |
|
|
mPendulum.startPosition.x = (width / 2).toFloat() |
|
|
mPendulum.startPosition.x = (width / 2).toFloat() |
|
|
paint.isAntiAlias = true |
|
|
paint.isAntiAlias = true |
|
@ -47,7 +48,7 @@ class CanvasPendulum @JvmOverloads constructor( |
|
|
canvas?.drawCircle( |
|
|
canvas?.drawCircle( |
|
|
mPendulum.stopPosition.x, |
|
|
mPendulum.stopPosition.x, |
|
|
mPendulum.stopPosition.y, |
|
|
mPendulum.stopPosition.y, |
|
|
mPendulum.ballRadius, |
|
|
|
|
|
|
|
|
mPendulum.ballr, |
|
|
paint |
|
|
paint |
|
|
) |
|
|
) |
|
|
|
|
|
|
|
@ -56,7 +57,7 @@ class CanvasPendulum @JvmOverloads constructor( |
|
|
paint.strokeWidth = 1f |
|
|
paint.strokeWidth = 1f |
|
|
paint.color = Color.RED |
|
|
paint.color = Color.RED |
|
|
if (mPendulum.angleVelocity > 0) { |
|
|
if (mPendulum.angleVelocity > 0) { |
|
|
if (mPendulum.stopPosition.x < (width / 3) - 30f && mPendulum.stopPosition.x + 30 > (width / 3) - 30f - mPendulum.ballRadius) { |
|
|
|
|
|
|
|
|
if (mPendulum.stopPosition.x < (width / 3) - 30f && mPendulum.stopPosition.x + 30 > (width / 3) - 30f - mPendulum.ballr) { |
|
|
paint.style = Paint.Style.FILL_AND_STROKE |
|
|
paint.style = Paint.Style.FILL_AND_STROKE |
|
|
paint.strokeWidth = 10f |
|
|
paint.strokeWidth = 10f |
|
|
paint.color = Color.GREEN |
|
|
paint.color = Color.GREEN |
|
@ -69,7 +70,7 @@ class CanvasPendulum @JvmOverloads constructor( |
|
|
paint.strokeWidth = 1f |
|
|
paint.strokeWidth = 1f |
|
|
paint.color = Color.RED |
|
|
paint.color = Color.RED |
|
|
if (mPendulum.angleVelocity < 0) { |
|
|
if (mPendulum.angleVelocity < 0) { |
|
|
if (mPendulum.stopPosition.x > (width / 1.5) - 30f && mPendulum.stopPosition.x + 30 < (width / 1.5) + 30f + mPendulum.ballRadius) { |
|
|
|
|
|
|
|
|
if (mPendulum.stopPosition.x > (width / 1.5) - 30f && mPendulum.stopPosition.x + 30 < (width / 1.5) + 30f + mPendulum.ballr) { |
|
|
paint.style = Paint.Style.FILL_AND_STROKE |
|
|
paint.style = Paint.Style.FILL_AND_STROKE |
|
|
paint.strokeWidth = 10f |
|
|
paint.strokeWidth = 10f |
|
|
paint.color = Color.GREEN |
|
|
paint.color = Color.GREEN |
|
@ -85,39 +86,45 @@ class CanvasPendulum @JvmOverloads constructor( |
|
|
|
|
|
|
|
|
if (mPendulum.magneticField) { |
|
|
if (mPendulum.magneticField) { |
|
|
|
|
|
|
|
|
|
|
|
var gravity = 0.981f |
|
|
|
|
|
var damping = 0.996f |
|
|
|
|
|
|
|
|
if (mPendulum.stopPosition.x > canvas.width / 4f && mPendulum.stopPosition.x <= canvas.width * 0.75f) { |
|
|
if (mPendulum.stopPosition.x > canvas.width / 4f && mPendulum.stopPosition.x <= canvas.width * 0.75f) { |
|
|
mPendulum.gravity = 1.981f |
|
|
|
|
|
|
|
|
gravity = 1.981f |
|
|
|
|
|
|
|
|
if (mPendulum.stopPosition.x > canvas.width / 3.toFloat() && mPendulum.stopPosition.x <= canvas.width / 1.5.toFloat()) { |
|
|
if (mPendulum.stopPosition.x > canvas.width / 3.toFloat() && mPendulum.stopPosition.x <= canvas.width / 1.5.toFloat()) { |
|
|
mPendulum.gravity = 2.981f |
|
|
|
|
|
|
|
|
gravity = 2.981f |
|
|
|
|
|
|
|
|
if (mPendulum.stopPosition.x >= canvas.width / 2.toFloat() - 3 && mPendulum.stopPosition.x <= canvas.width / 2.toFloat() + 3) { |
|
|
if (mPendulum.stopPosition.x >= canvas.width / 2.toFloat() - 3 && mPendulum.stopPosition.x <= canvas.width / 2.toFloat() + 3) { |
|
|
mPendulum.damping = 0.3f |
|
|
|
|
|
|
|
|
damping = 0.3f |
|
|
} |
|
|
} |
|
|
} |
|
|
} |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
mPendulum.angleAcceleration = ((-1 * mPendulum.gravity / mPendulum.stringLength) * (mPendulum.startAngle)).toFloat() |
|
|
|
|
|
|
|
|
mPendulum.angleAcceleration = |
|
|
|
|
|
((-1 * gravity / mPendulum.r) * (mPendulum.angle)).toFloat() |
|
|
mPendulum.angleVelocity += mPendulum.angleAcceleration |
|
|
mPendulum.angleVelocity += mPendulum.angleAcceleration |
|
|
mPendulum.angleVelocity *= mPendulum.damping |
|
|
|
|
|
mPendulum.startAngle += mPendulum.angleVelocity |
|
|
|
|
|
|
|
|
mPendulum.angleVelocity *= damping |
|
|
|
|
|
mPendulum.angle += mPendulum.angleVelocity |
|
|
//Polar to cartesian conversion |
|
|
//Polar to cartesian conversion |
|
|
mPendulum.stopPosition.x = mPendulum.stringLength * (sin(mPendulum.startAngle)).toFloat() |
|
|
|
|
|
mPendulum.stopPosition.y = mPendulum.stringLength * (cos(mPendulum.startAngle)).toFloat() |
|
|
|
|
|
|
|
|
mPendulum.stopPosition.x = mPendulum.r * (sin(mPendulum.angle)).toFloat() |
|
|
|
|
|
mPendulum.stopPosition.y = mPendulum.r * (cos(mPendulum.angle)).toFloat() |
|
|
//Origin transition |
|
|
//Origin transition |
|
|
mPendulum.stopPosition.x += mPendulum.startPosition.x |
|
|
mPendulum.stopPosition.x += mPendulum.startPosition.x |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
if (!mPendulum.magneticField) { |
|
|
if (!mPendulum.magneticField) { |
|
|
|
|
|
val gravity = 0.981f |
|
|
|
|
|
val damping = 0.996f |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
mPendulum.angleAcceleration = ((-1 * mPendulum.gravity / mPendulum.stringLength) * (mPendulum.startAngle)).toFloat() |
|
|
|
|
|
|
|
|
mPendulum.angleAcceleration = |
|
|
|
|
|
((-1 * gravity / mPendulum.r) * (mPendulum.angle)).toFloat() |
|
|
mPendulum.angleVelocity += mPendulum.angleAcceleration |
|
|
mPendulum.angleVelocity += mPendulum.angleAcceleration |
|
|
mPendulum.angleVelocity *= mPendulum.damping |
|
|
|
|
|
mPendulum.startAngle += mPendulum.angleVelocity |
|
|
|
|
|
|
|
|
mPendulum.angleVelocity *= damping |
|
|
|
|
|
mPendulum.angle += mPendulum.angleVelocity |
|
|
//Polar to cartesian conversion |
|
|
//Polar to cartesian conversion |
|
|
mPendulum.stopPosition.x = mPendulum.stringLength * (sin(mPendulum.startAngle)).toFloat() |
|
|
|
|
|
mPendulum.stopPosition.y = mPendulum.stringLength * (cos(mPendulum.startAngle)).toFloat() |
|
|
|
|
|
|
|
|
mPendulum.stopPosition.x = mPendulum.r * (sin(mPendulum.angle)).toFloat() |
|
|
|
|
|
mPendulum.stopPosition.y = mPendulum.r * (cos(mPendulum.angle)).toFloat() |
|
|
//Origin transition |
|
|
//Origin transition |
|
|
mPendulum.stopPosition.x += mPendulum.startPosition.x |
|
|
mPendulum.stopPosition.x += mPendulum.startPosition.x |
|
|
} |
|
|
} |
|
@ -131,11 +138,11 @@ class CanvasPendulum @JvmOverloads constructor( |
|
|
mPendulum.magneticField = magnet |
|
|
mPendulum.magneticField = magnet |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
fun getVelocity(): Double { |
|
|
|
|
|
var currentVelocity = mPendulum.angleVelocity * 1000 |
|
|
|
|
|
|
|
|
fun getVelocity(): Double { |
|
|
|
|
|
var currentVelocity = mPendulum.angleVelocity * 1000 |
|
|
|
|
|
|
|
|
val roundoff = (currentVelocity * 100.0).roundToInt() / 100.0 |
|
|
|
|
|
return abs(roundoff) |
|
|
|
|
|
|
|
|
val roundoff = (currentVelocity * 100.0).roundToInt() / 100.0 |
|
|
|
|
|
return abs(roundoff) |
|
|
} |
|
|
} |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
@ -147,15 +154,12 @@ class Pendulum { |
|
|
|
|
|
|
|
|
var startPosition: Position = Position(0f, 0f) |
|
|
var startPosition: Position = Position(0f, 0f) |
|
|
var stopPosition: Position = Position(0f, 0f) |
|
|
var stopPosition: Position = Position(0f, 0f) |
|
|
|
|
|
var r = 800f |
|
|
|
|
|
|
|
|
var startAngle: Double = Math.PI / 12 |
|
|
|
|
|
var stringLength = 750f |
|
|
|
|
|
var ballRadius: Float = 70.0f |
|
|
|
|
|
var damping = 0.996f |
|
|
|
|
|
|
|
|
|
|
|
var angleVelocity: Float = 0.0f |
|
|
|
|
|
var angleAcceleration: Float = 0.0f |
|
|
|
|
|
|
|
|
|
|
|
var gravity = 0.981f |
|
|
|
|
|
|
|
|
//PI/6 Max ausschwingen |
|
|
|
|
|
var angle: Double = Math.PI / 12 |
|
|
|
|
|
var angleVelocity: Float = 0.0f // |
|
|
|
|
|
var angleAcceleration: Float = 0.0f // |
|
|
|
|
|
var ballr: Float = 70.0f // |
|
|
var magneticField: Boolean = false |
|
|
var magneticField: Boolean = false |
|
|
} |
|
|
} |