Narzędzia użytkownika

Narzędzia witryny


Action disabled: source
pamx:pamx06

(1) W górnej części widoku Twojego kalkulatora arytmetycznego z poprzedniego zestawu dodaj Canvas i wygeneruj na nim osie układu współrzędnych (XY) i wykres funkcji f(x) = x^2-4, w przedziale od -3 do 3, a także tekst zawierający postać tej funkcji i informacje o obliczonej wartości delty i pierwiastków. Dobierz odpowiednio wielkość i lokalizacje wszystkich elementów, tak aby wszystkie informacje umieszczone na wyświetlaczu graficznym były czytelne. Szczegóły dotyczące użycia tego elementu znajdziesz w dokumentacji i w przykładzie poniżej.

https://developer.android.com/develop/ui/compose/graphics/draw/overview

class MainActivity : ComponentActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        enableEdgeToEdge()
        setContent {
 
            Calc()
        }
    }
 
    @Composable
    fun Calc(){
 
        val s: MutableState<String> = remember{mutableStateOf("0")}
        val op: MutableState<Char> = remember{mutableStateOf('+')}
        val buf: MutableIntState = remember{mutableIntStateOf(0)}
 
 
        Column(
            modifier = Modifier
                .fillMaxWidth()
                .padding(16.dp),
            verticalArrangement = Arrangement.Center,
            horizontalAlignment = Alignment.CenterHorizontally
        ) {
 
            Spacer(modifier = Modifier.height(100.dp))
 
 
            // Canvas
            val textMeasurer = rememberTextMeasurer()
 
            Canvas(
                modifier = Modifier
                    .size(300.dp)
                    .background(Color.LightGray)
            ) {
                // Rozmiar Canvas
                val canvasWidth = size.width
                val canvasHeight = size.height
 
                // Środek układu współrzędnych
                val centerX = canvasWidth / 2
                val centerY = canvasHeight / 2
 
                // Skala (jak duży ma być wykres na Canvasie)
                val scaleX = canvasWidth / 20 // Skala dla osi X (przedział -10 do 10)
                val scaleY = canvasHeight / 4 // Skala dla osi Y
 
                // Rysowanie osi X i Y
                drawLine(
                    color = Color.Black,
                    start = Offset(0f, centerY),
                    end = Offset(canvasWidth, centerY),
                    strokeWidth = 2f
                )
                drawLine(
                    color = Color.Black,
                    start = Offset(centerX, 0f),
                    end = Offset(centerX, canvasHeight),
                    strokeWidth = 2f
                )
 
                // Rysowanie wykresu funkcji sin(x)/x
                val points = mutableListOf<Offset>()
                for (x in -1000..1000) { // Iteracja po wartościach w przedziale od -10 do 10 (skalowane)
                    val realX = x / 100f // Przeliczenie wartości na rzeczywisty przedział (-10 do 10)
                    val yValue = if (realX == 0f) 1f else kotlin.math.sin(realX) / realX // Obliczenie sin(x)/x
 
                    // Przeliczenie współrzędnych na Canvas (skala i przesunięcie środka)
                    val canvasX = centerX + realX * scaleX
                    val canvasY = centerY - yValue * scaleY
 
                    points.add(Offset(canvasX, canvasY))
                }
 
                // Rysowanie punktów jako wykresu funkcji
                drawPoints(
                    points = points,
                    pointMode = PointMode.Polygon, // Łączenie punktów linią
                    color = Color.Blue,
                    strokeWidth = 2f
                )
 
                // Tekst
                drawText(
                    textMeasurer = textMeasurer,
                    text = "f(x)=sin(x)/x",
                    topLeft = Offset(x = 430f, y = 100f),
                    style = androidx.compose.ui.text.TextStyle(
                        fontSize = 20.sp, color = Color.Black
                    )
                )
 
            }
 
            Spacer(modifier = Modifier.height(60.dp))
 
            Row{
 
                Text(
                    modifier = Modifier.fillMaxWidth(0.5f),
                    text = s.value,
                    fontSize = 20.sp
                )
 
            }
 
            Spacer(modifier = Modifier.height(10.dp))
 
 
            Row{
 
                Button(onClick = { if (s.value == "0") s.value = "1" else s.value += "1" }) {
 
                    Text(text = "1")
                }
 
                Button(onClick = {if(s.value == "0") s.value="2" else s.value+="2"}) {
 
                    Text( text="2" )
                }
 
                Button(onClick = {if(s.value == "0") s.value="3" else s.value+="3"}) {
 
                    Text( text="3" )
                }
 
                Button(onClick = {op.value='+'; buf.intValue = s.value.toInt(); s.value="0"}) {
 
                    Text( text="+" )
                }
 
            }
 
            Row{
 
                Button(onClick = {if(s.value == "0") s.value="4" else s.value+="4"}) {
 
                    Text( text="4" )
                }
 
                Button(onClick = {}) {
 
                    Text( text="" )
                }
 
                Button(onClick = {}) {
 
                    Text( text="" )
                }
 
                Button(onClick = {op.value='-'; buf.intValue = s.value.toInt(); s.value="0"}) {
 
                    Text( text="-" )
                }
 
            }
 
            Row{
 
                Button(onClick = {if(s.value == "0") s.value="7" else s.value+="7"}) {
 
                    Text( text="7" )
                }
 
                Button(onClick = {}) {
 
                    Text( text="" )
                }
 
 
                Button(onClick = {}) {
 
                    Text( text="" )
                }
 
                Button(onClick = {}) {
 
                    Text( text="" )
                }
 
            }
 
            Row{
 
                Button(onClick = {s.value="0" }) {
 
                    Text( text="C" )
                }
 
                Button(
 
                    onClick = {if(op.value=='+') buf.intValue += s.value.toInt() else buf.intValue -= s.value.toInt(); s.value = buf.intValue.toString()},
                    modifier = Modifier.fillMaxWidth(0.5f)
                )
                {
 
                    Text( text="=" )
                }
 
            }
        }
    }
}


I jeszcze kontrolnie lista potrzebnych importów

import android.os.Bundle
import androidx.activity.ComponentActivity
import androidx.activity.compose.setContent
import androidx.activity.enableEdgeToEdge
import androidx.compose.foundation.Canvas
import androidx.compose.foundation.background
import androidx.compose.foundation.layout.Arrangement
import androidx.compose.foundation.layout.Column
import androidx.compose.foundation.layout.Row
import androidx.compose.foundation.layout.Spacer
import androidx.compose.foundation.layout.fillMaxWidth
import androidx.compose.foundation.layout.height
import androidx.compose.foundation.layout.padding
import androidx.compose.foundation.layout.size
import androidx.compose.material3.Button
import androidx.compose.material3.Text
import androidx.compose.runtime.Composable
import androidx.compose.runtime.MutableIntState
import androidx.compose.runtime.MutableState
import androidx.compose.runtime.mutableIntStateOf
import androidx.compose.runtime.mutableStateOf
import androidx.compose.runtime.remember
import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
import androidx.compose.ui.geometry.Offset
import androidx.compose.ui.graphics.Color
import androidx.compose.ui.graphics.PointMode
import androidx.compose.ui.text.drawText
import androidx.compose.ui.text.rememberTextMeasurer
import androidx.compose.ui.unit.dp
import androidx.compose.ui.unit.sp


(2) Do Twojego kalkulatora dodaj przyciski umożliwiające dodanie do wyświetlacza potrzebnych symboli (takich jak x, y, f, symbol przecinka) w ten sposób żeby możliwe było napisanie na wyświetlaczu wielomianu drugiego stopnia (postaci „f(x) = ax^2 + bx + c”) oraz przycisku „Plot”. Po naciśnięciu tego przycisku, Twój kalkulator powinien przeparsować wprowadzony wielomian i odczytać wartości współczynników a, b i c, a następnie wyznaczyć deltę i miejsca zerowe oraz narysować wykres funkcji w przedziale obejmującym wszystkie (dwa, jeden lub zero) miejsca zerowe. Informacje o obliczonych wartościach delty i pierwiastków powinny być wydrukowane obok wykresu.

pamx/pamx06.txt · ostatnio zmienione: 2025/03/24 09:42 przez zbd