Help me with a project on fluid resistance

HI!! I want to know why the ball doesn’t slow down in the water.

ofApp.h

class MovingBall : public ofApp {
public:
int x;
int y;
int radius;
ofVec2f location;
ofVec2f velocity;
ofVec2f acceleration;
ofVec2f force;
ofVec2f wind = ofVec2f(0,0);
ofVec2f gravity= ofVec2f(0.0,0.3);;
float mass;

MovingBall(ofVec2f l,float m){
    location = l;
    mass = m;
}
MovingBall() {}

void setForce(ofVec2f &force){
    acceleration += force;
}
void update(){
    force += gravity+wind;
    force /= mass;
    acceleration += force;
    velocity += acceleration;
    location += velocity;
}

void display(){
    ofSetColor(0, 0, 0);
    ofDrawCircle(location,mass*6);
}

void checkEdge(){
    
    if(location.x + 30 > ofGetWidth() || location.x + 30 <0) {
        velocity.x *= -1;
    }
    if (location.y + 30 > ofGetHeight() || location.y + 30 < 0) {
        velocity.y *= -1;
    }
    acceleration *= 0;
}

};

class Liquid : public MovingBall {
private:
float x , y, w, h;
float c;
public:
Liquid(float x_,float y_, float w_, float h_, float c_){
x=x_;
y=y_;
w=w_;
h=h_;
c=c_;
}

void display() {
    ofSetColor(0,0,250,100);
    ofDrawRectangle(x,y,w,h);
}

bool isInside(MovingBall &l){
     if(l.x > x && l.x<x+w &&
        l.y > y && l.y<y+h) {
         return true;
     }else {
         return false;
     }
}
void drag(Liquid &l){
    float speed = velocity.length();
    float dragMagnitude = l.c * velocity.length() * velocity.length();
    ofVec2f drag = velocity.getNormalized();
    drag *= dragMagnitude;
    acceleration += drag;
}

};

ofApp.cpp

#include “ofApp.h”
//--------------------------------------------------------------
void ofApp::setup(){

}

//--------------------------------------------------------------
void ofApp::update(){

}

//--------------------------------------------------------------
void ofApp::draw(){
ofBackground(255);
static MovingBall balls(ofVec2f(ofGetWidth()/2-20,0),5);
static Liquid liquid(0,ofGetHeight()/2,ofGetWidth(),ofGetHeight()/2,10);

liquid.display();
if(liquid.isInside(balls)){
    liquid.drag(liquid);
}
ofVec2f gravity = ofVec2f(0.0,0.3);
ofVec2f wind = ofVec2f(0,0);

balls.setForce(gravity);
balls.setForce(wind);

balls.display();
balls.update();
balls.checkEdge();
balls.acceleration *= 0;

}

Hi @jewel,

Your last line in ofApp::draw() resets the ball acceleration to 0.
And before you draw the ball you set it’s gravity to 0.3.
That’s why the ball never slows down :wink:

I hope that helps.

Best regards,
Felix